Regex фиксирует каждое вхождение слова в двух разделителях - PullRequest
6 голосов
/ 25 июля 2010

Скажем, у меня длинная строка текста, и я хочу записывать каждый раз, когда слово this упоминается в круглых скобках.Как я мог это сделать?Следующий шаблон соответствует только первому this, игнорируя каждое вхождение после:

/\(.*(this).*\)/g

Например, используя приведенный выше шаблон для следующего текста:

Etiam scelerisque, nuncac egestas последовательно, (odio this nibh euismod nulla, eget auctor orci nibh vel this nisi. Aliquam this erat volutpat).

Вернет только первый this после слова odio.

Что я делаю не так?

Ответы [ 4 ]

7 голосов
/ 25 июля 2010

Во-первых, не будьте жадными.

/\(.*?(this).*?\)/g

Во-вторых, если вы хотите подсчитать количество вхождений 'this', регулярное выражение, вероятно, неправильный инструмент здесь.Проблема в том, что вам нужно сопоставить закрывающий разделитель, чтобы определить, что заключено первое «this», что означает, что продолжение применения регулярного выражения не будет совпадать с чем-либо внутри уже использованного набора разделителей.

Регулярное выражение, приведенное выше, будет ловить такие вещи, как:

foo (baz this bar) (foo this)

Но нет (оно будет совпадать только дважды, один раз для каждого набора разделителей):

foo (this this bar) baz (this this this)

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

1 голос
/ 25 июля 2010

использование .* будет соответствовать каждому отдельному символу в строке поиска. То, что вы на самом деле делаете здесь, - это жадное сопоставление всего до и после первого вхождения this, найденного в скобках. Ваши текущие результаты матчей, вероятно, будут выглядеть примерно так:

["(odio this nibh euismod nulla, eget auctor orci nibh vel this nisi. Aliquam this erat volutpat)", "this"]

Где первый элемент в массиве - это вся подстрока, соответствующая выражению, а все, что следует, - это захваченные значения вашего регулярного выражения.

Если вы хотите сопоставить каждое вхождение this в скобках, одним из решений было бы сначала получить подстроку всего, что в скобках, а затем найти this в этой подстроке:

# Match everything inside the parentheses
/\([^\)]*\)/

# Match all occurrences of the word 'this' inside a substring
/this/g
0 голосов
/ 24 января 2018

(это)

приведенная выше строка работает для меня, попробуйте это на http://regex101.com

0 голосов
/ 28 ноября 2013

Я реализовал регулярное выражение для включения всех буквенно-цифровых символов, используя приведенное ниже регулярное выражение:

# cat testfile 
aabc a1 +++    xyz 20   30 =40  -r
# cat testfile | sed -e "s/\([[:alnum:]]\{1,\}\)/<pre>\1<post>/g"
<pre>aabc<post> <pre>a1<post> +++    <pre>xyz<post> <pre>20<post>   <pre>30<post> =<pre>40<post>  -<pre>r<post>
#

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...