2016-10-18 3 views
2

Im пытается создать регулярное выражение, чтобы поймать [[хуг | ASD]], но не [[хуг]] В тексте:Regex любые символы, за исключением некоторых

'''Diversity Day'''" is the second episode of the [[The Office (U.S. season 1)]|first season]] of the American [[comedy]] [[television program|television series]] ''[[The Office (U.S. TV series)|The Office]]'', and the show's second episode overall. Written by [[B. J. Novak]] and directed by [[Ken Kwapis]], it first aired in the United States on March 29, 2005, on [[NBC]]. The episode guest stars ''Office'' consulting producer [[Larry Wilmore]] as [[List_of_characters_from_The_Office_(US)#Mr._Brown|Mr. Brown]].

Следующие результаты должны быть захватили:

[[The Office (U.S. season 1)]|first season]] <-- keep in mind of the "]" before "|", "]" in that case is a literal character not a breaking one "]]" 
[[television program|television series]] 
[[The Office (U.S. TV series)|The Office]] 
[[List_of_characters_from_The_Office_(US)#Mr._Brown|Mr. Brown]] 

Я пытался использовать это:

\[\[([^|]+)\|([^|]+)\]\] 

но я не могу понять, как игнорировать оба "|" и "]]" в группах. [^ | (]])] не будет работать, потому что он не будет соответствовать «]]« но только символ «]» (это должно быть целое слово)

Пожалуйста, помогите, спасибо!

+0

Кстати, в [[хуг | ASD]], должны быть отражено в двух группах «А» и «ASD» – user1592987

+1

Измените свой пост, чтобы отформатировать его, это трудно читать и понимать. –

ответ

6

Вы можете рассчитывать на tempered greedy token здесь:

\[\[((?:(?!]]).)*)\|((?:(?!]]).)*)]] 

Смотрите regex demo

Детали:

  • \[\[ - 2 [ символы
  • ((?:(?!]]).)*) - Группа 1 (примечание* может быть превращен в ленивый *? здесь, особенно если первые части короче, чем вторые части) захват:
    • (?:(?!]]).)* - ноль или более последовательности
      • . - любой символ (но символ новой строки, используйте шаблон с RegexOptions.Singleline, если ваши строки охватывают несколько строк) ...
      • (?!]]) - это не начало последовательности ]] (т.е. если . не соответствует ], который следовал с другой ])
  • \| - буквальный |
  • ((?:(?!]]).)*) - Группа 2 захватывая же подшаблоном, как 2-й группы
  • ]] - 2 буквальным ] на конце.

Гораздо более эффективным "раскатали" версия этого регулярное выражение:

\[\[([^]|]*(?:](?!])[^]|]*)*)\|([^]]*(?:](?!])[^]]*)*)]] 

См regex demo. Это регулярное выражение будет обрабатывать первый | как внутренний разделитель полей. См. my other answer о том, как развернуть закаленные жадные жетоны.

enter image description here

+0

WOW! это именно то, что мне нужно. Это было быстро! Спасибо!! – user1592987

+0

Я не хочу усложнять шаблон дальше, так как я думаю, что строки, с которыми вы имеете дело, не так долго. Если это так, вы можете рассмотреть возможность разглаживания умеренных жадных токенов, как описано в [моем другом ответе] (http://stackoverflow.com/a/37343088/3832970). –

+0

они просто короткие струны, так что все будет хорошо .. большое спасибо! – user1592987

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