2015-07-01 5 views
0

вот пример текста:RegEx если содержит определенное слово

[AME = \ "? смотреть v = 12345 \"] YouTube - бла Lorem бла [/ AME] Lorem Ipsum является просто фиктивный текст печатной и печатной промышленности. Lorem Ipsum был стандартным фиктивным текстом отрасли с тех пор, как был выпущен 1500 года, когда неизвестный принтер взял камбуз типа и закрепил его , чтобы сделать типовой экземпляр книги. [ame = \ "watch? V = 123456 \"] YouTube - blah blah blah [/ ame] Он пережил не только пять столетий, но и прыжок в электронную верстку, оставаясь практически неизменным. Это было популярным в 1960-е годы с выпуском Letraset листов , содержащих [AME = \ "смотреть v = 1234 \?"] YouTube - бла Ω бла Lorem [/ AME] Lorem Ipsum проходы, и совсем недавно с рабочим столом Издательское программное обеспечение, такое как Aldus PageMaker, включая версии Lorem Ipsum.

мне нужно регулярное выражение, которые соответствуют только [AME] [/ AME] со словом Lorem внутри. Кроме того, в последнем экземпляре [ame] имеется специальный символ (буква Omega по-гречески) Ω. Мне нужно регулярное выражение для соответствия [ame] с omega (Ω) внутри.

Я пробовал (\[ame=[^\]]*\])([lorem])(\[\/ame\]), но ничего не происходит. Пожалуйста, проверьте его here

ответ

0

Так как вы ничего не говоря уже о группе захватывает первое решение не использует их:

/\[ame[^\[]+lorem[^\[]*\[\/ame\]/g 

Ломая это вниз:

  • \[ame: начать матч с "AME" открывающий тег
  • [^\[]+: продолжайте матч до первого "["
  • lorem: матч "Lorem"
  • [^\[]*: продолжать матч до первого "["
  • \[\/ame\]: конец матча с закрывающим тегом "ame"

Специальный соус - это два жадных матча, которые в сочетании с совпадением для «lorem» будут соответствовать тегу «ame», содержащему «lorem».Этот подход не волнует, где «лорам» встречается внутри тега (оно может быть в ссылке, а не в тексте).

Второе решение - если вы заботитесь о группах захвата (скажем, для ссылок и текстовых значений) и что «lorem» встречается только в текстовом значении. Основываясь на один и те же понятия для первого решения, но при добавлении в группе захватывает даешь:

/\[ame=\\"([^"]+)\\"\]([^\[]*lorem[^\[]*)\[\/ame\]/g 

Нарушение этого один вниз:

  • \[ame=\\"([^"]+)\\"\]: начать матч с «AME» открывающий тегом, используя захват группы для значение ссылки
  • ([^\[]*lorem[^\[]*): соответствует текстовому значению, содержащему «Lorem» со второй группой захватом
  • \[\/ame\]: конец матча с «AME» закрывающий тег

Соответствие текстового значения похоже на совпадение предыдущего решения, но теперь учетные записи показывают, что текстовое значение может быть только «lorem» (поскольку предыдущее решение просто соответствовало всему тегу).

+0

Благодарим вас за ответ, кажется, что ваш путь работает. Я должен попробовать свой первоначальный текст и сообщить вам результаты. Я ценю ваше длинное и подробное объяснение! – iWiFi

0

быстрое решение:

(\[ame=[^\]]*\])[^[]*?lorem[^[]*?(\[\/ame\]) 

Я не оптимизировать его каким-либо образом.

+0

Кажется, что не работает мой друг :) – iWiFi

+0

Я снова тестировал его в regexr. Оно работает. – Leif

+0

Я извиняюсь, вы правы :) Я работаю – iWiFi

0

Узор в середине (lorem) не должен быть заключен в []:

/(\[ame=[^\]]*\]).*(lorem).*(\[\/ame\])/ 

посмотреть здесь: https://regex101.com/r/eC9sS5/1

http://regexr.com/3bae0

+0

Это соответствует любому '[ame]' с последним возможным '[/ ​​ame]', включая много ненужной информации между ними. –

0

Таким образом, другие ответы по-прежнему имеют значительные недостатки (неспособность иметь символ [ между тегами ame и омега-частью также игнорируются, хотя это легко сделать).

Проблема аналогична проблеме синтаксического анализа HTML регулярных выражений. Если вы хотите иметь информацию между [ame] и [/ame], теги могут повторяться в течение документа. Эта проблема показана здесь: https://regex101.com/r/rC3eK4/1, где тег «перескакивает» на следующий, чтобы иметь установленные требования. Чтобы этого избежать, в других ответах указывалось, что они просто не позволят [ в списке символов. Однако, кто скажет, что вы не можете иметь другой тег внутри? [ame] this is [b]bolded[/b][/ame].

Предлагаю двухэтапное решение. Сначала извлеките содержимое всех тегов [ame] с помощью \[ame.*?\].*?\[\/ame\]. https://regex101.com/r/rC3eK4/2. Это приведет к извлечению тегов ame даже с внутренними тегами. Затем посмотрите, можете ли вы совместить содержимое с тем, что вы просили, с \[ame.*?\](?:(.*?lorem.*?)|(.*?Ω.*?))\[\/ame\], как видно https://regex101.com/r/rC3eK4/3. Он также будет захватывать содержимое, которое вы хотите, в группе захвата .

+0

Благодарим за сообщение. Я вижу здесь вашу точку зрения с возможностью добавления дополнительных скобок внутри текста. Но что-то странное. Я взял ваш последний пример и добавил текст между [ame] [/ ame] и не может его правильно разобрать. Пожалуйста, проверьте здесь [link] (https://regex101.com/r/rC3eK4/7) – iWiFi

Смежные вопросы