Regex найти два слова на странице
Я пытаюсь найти все страницы, содержащие слова "text1" и "text2".
Мое регулярное выражение:
text1(.|\n)*text2
он не работает.
![enter image description here]()
Ответы
Ответ 1
Если ваш IDE поддерживает флаг s
(однострочный) (поэтому символ .
может соответствовать символам новой строки), вы можете искать свои объекты с помощью:
(text1).*(text2)|\2.*\1
Пример с s
флагом
Если среда IDE не поддерживает флаг s
, вам нужно использовать [\s\S]
вместо .
:
(text1)[\s\S]*(text2)|\2[\s\S]*\1
Пример с [\s\S]
В некоторых языках вместо \1
и \2
используются $1
и $2
, поэтому вам может потребоваться изменить это.
EDIT:
В качестве альтернативы, если вы хотите просто сопоставить, что файл содержит обе строки (но на самом деле ничего не выбрать), вы можете использовать опережения:
(?s)^(?=.*?text1)(?=.*?text2)
Это не касается порядка (или числа) аргументов, и для каждого дополнительного текста, который вы хотите найти, вы просто добавляете другой (?=.*?text_here)
. Этот подход хорош, так как вы можете даже включить регулярное выражение вместо простых строк.
Ответ 2
text0[\s\S]*text1
Попробуйте это. Это должно сделать это за вас.
То, что это делает, соответствует всем, включая многострочный., как .*?
с флагом s
.
\s
заботится о spaces,newlines,tabs
\s
берет любой символ пробела.
Ответ 3
Если вы хотите, чтобы регулярное выражение соответствовало нескольким строкам, я бы попытался:
text1[\w\W]*text2
Использование .
не является хорошим выбором, потому что оно обычно не совпадает с несколькими строками. Кроме того, для сопоставления одиночных символов я думаю, что использование квадратных скобок более идиоматично, чем использование ( ... | ... )
Если вы хотите, чтобы совпадение не зависело от порядка, используйте это:
(?:text1[\w\W]*text2)|(?:text2[\w\W]*text1)
Ответ 4
Добавление ответа для IntelliJ
Основываясь на ответе @OnlineCop, чтобы поменять порядок двух выражений в IntelliJ, вы должны стилизовать поиск как в принятом ответе, но так как IntelliJ не разрешает однострочную версию, вам нужно поставить оператор replace в отдельном поле. Кроме того, IntelliJ использует $
для идентификации выражений вместо \
.
Например, я, как правило, ставил мой null
в конце моих сравнений, но некоторые предпочитают в противном случае. Итак, чтобы сохранить совместимость в работе, я использовал этот шаблон регулярного выражения, чтобы поменять порядок моих сравнений:
![введите описание изображения здесь]()
Обратите внимание, что IntelliJ показывает в подсказке, что будет результатом замены.