Подтвердить что ты не робот

Regex найти слово в строке

В общих чертах я хочу найти в строке некоторую подстроку, но только если она там содержится.

У меня было выражение:

^.*(\bpass\b)?.*$

И тестовая строка:

high pass h3 

Когда я тестирую строку через выражение, я вижу, что вся строка найдена (но группа "pass" not):

match : true
groups count : 1  
group : high pass h3 

Но мне нужно, чтобы этот матч состоял из двух групп: 1: высокий проход h3 2: пройти

И когда я тестирую, например, строку - высокий h3, у меня все еще была обнаружена одна группа - высокая h3

Как я могу это сделать?

4b9b3361

Ответ 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" (но тогда также будет функция "найти строку в строке", и это, вероятно, будет быстрее без сложностей регулярного выражения).