Ответ 1
Возможно... с Trickery Regex!
Отказ от ответственности: это не предназначено для практического решения, а является иллюстрацией способа использования расширения потрясающего руткима регулярных выражений. Более того, он работает только с механизмами регулярных выражений, которые позволяют группам захвата ссылаться на себя. Например, вы можете использовать его в Notepad ++, поскольку он использует механизм PCRE, но не в Java.
Скажем, ваш файл:
some code
more code
hey, hello!
more code
В нижней части файла вставьте :1:2:3:4:5:6:7
, где :
- разделитель, не найденный в остальной части кода, и где числа идут как минимум так же высоко, как количество строк.
Затем, чтобы получить строку первого hello
, вы можете использовать:
(?m)(?:(?:^(?:(?!hello).)*(?:\r?\n))(?=[^:]+((?(1)\1):\d+)))*.*hello(?=[^:]+((?(1)\1)+:(\d+)))
Номер строки первой строки, содержащей hello, будет снят группой 2.
- В демо, см. захват группы 2 в правой панели.
- Хак полагается на группу, ссылающуюся на себя. В классическом трюке @Qtax это делается с помощью
(?>\1?)
. Для разнообразия я использовал условное выражение.
Объяснение
- Первая часть регулярного выражения - это шкипер строки, который фиксирует увеличивающееся количество счетчика строк внизу группы 1
- Вторая часть регулярного выражения соответствует
hello
и фиксирует номер строки для группы 2 - Внутри шкипера линии
(?:^(?:(?!hello).)*(?:\r?\n))
соответствует строке, которая не содержит приветствия. - Внутри шкипера линии
(?=[^:]+((?(1)\1):\d+))
lookahead возвращает нас к первому:
с[^:]+
, а внешние скобки в((?(1)\1):\d+))
захватывают в группу 1... если группа 1 установлена (?(1)\1)
, тогда Группа 1, то, независимо, двоеточие и некоторые цифры. Это гарантирует, что каждый раз, когда шкипер линии соответствует строке, группа 1 расширяется до большей части:1:2:3:4:5:6:7
-
*
связывает шкипер линии с нулем или более раз -
.*hello
соответствует строке сhello
- Смотрище
(?=[^:]+((?(1)\1)+:(\d+)))
идентично таковому в строке шкипера, за исключением того, что на этот раз цифры записываются в группу 2:(\d+)
-
Ссылка
- трюк Qtax (недавно получил дополнительную награду от @AmalMurali)
- Заменить слово номером строки, на которой он найден