Regex: строки поиска, расширяющиеся на точное количество строк

Я хочу найти такие строки, как:

cast('"
                        + object.method()
                        + "' as datetime 

Приведенный выше блок кода может состоять всего из одной или двух строк. Итак, следующие выражения:

cast('" + object.method()+"' as datetime   

or

cast('"
                            + object.method()+ "' as datetime   

тоже хорошие матчи.

Поэтому я использовал в качестве шаблона регулярного выражения следующее выражение:

(?s)(?i)cast.*?datetime  

Но строки, которые я хочу сопоставить, не должны превышать 3 строки
Как я могу выразить это условие в шаблоне регулярного выражения?

Заранее спасибо.


person mounaim    schedule 27.11.2014    source источник


Ответы (3)


Как насчет регулярного выражения

cast([^\n]+\n){0,2}.*datetime

Пример: http://regex101.com/r/hQ9xT1/1.

  • [^\n]+\n соответствует чему угодно, кроме \n, за которым следует \n

  • {0,2} квантификатор квантифицирует выражение максимум 2 раза, то есть соответствует 2 строкам

  • .* соответствует чему-либо в последней строке

  • datetime соответствует datetime

person nu11p01n73R    schedule 27.11.2014
comment
логически это правильное регулярное выражение. Но я не знаю, почему Eclipse не дает результатов. Также, пожалуйста, взгляните на мой вопрос, я его отредактировал :) - person mounaim; 27.11.2014
comment
Недопустимое повторение возле индекса 15 :/ - person mounaim; 27.11.2014
comment
почему-то это не дает результата!! Но ответ @vks дает совпадения, которые я ищу - person mounaim; 27.11.2014
comment
Ну, этот образец в вашем ответе дает только 4 совпадения, в то время как один vks дает 234 - person mounaim; 27.11.2014
comment
Я думаю, вы хотите сказать обратное. с тех пор, как вы заменили // на /, это сработало. тег java был там с самого начала :) спасибо за демо на regex101 - person mounaim; 27.11.2014
comment
@mounaim Да, я заметил тег java в начале. В регулярном выражении Java мы не можем написать \n, нам нужно экранировать его как \\n Это была единственная причина, по которой я написал \\n в первую очередь. В любом случае я рад, что смог исправить это Ура !!! :D - person nu11p01n73R; 27.11.2014

cast[^\n]+\n[^\n]+\n[^\n]*datetime

Попробуйте это. См. демо.

http://regex101.com/r/hQ9xT1/2

Редактировать:

Использовать

cast([^\n]+\n){0,2}[^\n]*datetime

Если вы хотите сопоставить строки от 1 до 3.

http://regex101.com/r/hQ9xT1/4

person vks    schedule 27.11.2014

cast(.+([\n])?){1,3}datetime

соответствует cast один раз*

соответствует любой группе символов (минимум 1), за которой следует 0 или 1 новая строка (.+([\n])?)

соответствовать вышеуказанной группе хотя бы один раз, но не более 3 раз {1,3}

сопоставьте слово datetime один раз*

* хотя я указал «совпадение один раз», я имею в виду буквальное совпадение в отношении шаблона, если у вас есть глобальный модификатор, это выражение позволит несколько совпадений вышеуказанного шаблона поиска в вашем тексте.

person SierraOscar    schedule 27.11.2014