Regex найти слово в строке
В общих чертах я хочу найти в строке некоторую подстроку, но только если она там содержится.
У меня было выражение:
^.*(\bpass\b)?.*$
И тестовая строка:
high pass h3
Когда я тестирую строку через выражение, я вижу, что вся строка найдена (но группа "pass" not):
match : true
groups count : 1
group : high pass h3
Но мне нужно, чтобы этот матч состоял из двух групп:
1: высокий проход h3
2: пройти
И когда я тестирую, например, строку - высокий h3, у меня все еще была обнаружена одна группа - высокая h3
Как я могу это сделать?
Ответы
Ответ 1
Используйте это:
^(.*?(\bpass\b)[^$]*)$
- Первый захват для всей строки.
- Второй захват для ожидаемого слова.
Просмотрите демонстрацию .
Больше объяснений:
┌ first capture
|
⧽------------------⧼
^(.*?(\bpass\b)[^$]*)$
⧽-⧼ ⧽---⧼
| ⧽--------⧼ |
| | └ all characters who are not the end of the string
| |
| └ second capture
|
└ optional begin characters
Ответ 2
Вам просто не хватает для работы (плюс, что ?
находится в неправильном положении).
Если вы хотите совпадение с событием frist: ^(.*?)(\bpass\b)(.*)$
.
Если вы хотите соответствовать последнему событию: ^(.*)(\bpass\b)(.*?)$
.
Это приведет к 3 группам захвата: все до, точное совпадение и все следующее.
.
будет соответствовать (в зависимости от ваших настроек почти) что угодно, но только одному символу.
?
сделает предыдущий элемент опциональным, т.е. появится не полностью или ровно один раз.
*
будет соответствовать предыдущему элементу несколько раз, т.е. не на всех или неограниченном количестве раз. Это будет соответствовать как можно большему количеству символов.
Если вы объедините оба значения в *?
, вы получите нечеткое соответствие, по существу совпадающее с максимально возможным количеством символов (до 0).
Изменить:
Поскольку я читал, вам нужна только pass
и полная строка, в зависимости от вашей реализации/языка, должно быть достаточно: ^.*(\bpass\b).*?$
(опять же, нечеткое совпадение может быть заменено жадным). Вы получите целое выражение/соответствие как группа 0, а первое заданное совпадение - как группа 1.
Ответ 3
Период соответствует только одному символу, поэтому вы
^.(\bpass\b)?.$
соответствует:
- Начало ввода
- Один символ
- Необязательно
- Граница слов
- "пропуск"
- Граница слов
- Одиночный char
- Конец ввода
который я бы не ожидал совпадения с "high pass h3" вообще.
Регулярное выражение:
pass
(без метасимволов) будет соответствовать любой строке, содержащей "pass" (но тогда также будет функция "найти строку в строке", и это, вероятно, будет быстрее без сложностей регулярного выражения).