2016-05-02 4 views
1

Я пытаюсь создать регулярное выражение, которое соответствует шаблону в некоторой части строки, но не в другой части строки.Обеспечить несоответствие шаблона в пределах области

Я пытаюсь соответствовать подстроке, что

(я) окружен сбалансированной парой одного или несколько последовательных обратных кавычек `

(II) и не включает в себя стольких последовательной кавычки как в окружающие рисунки

(iii) где окружающие узоры (последовательность обратных выступов) не смежны с другими обратными окнами.

Это некоторый вариант синтаксиса обозначения встроенного кода в синтаксисе Markdown.

Примеры матчей заключаются в следующем:

"xxx`foo`yyy"    # => matches "foo" 
"xxx``foo`bar`baz``yyy"  # => matches "foo`bar`baz" 
"xxx```foo``bar``baz```yyy" # => matches "foo``bar``baz" 

Одно регулярное выражение для достижения этой цели является:

/(?<!`)(?<backticks>`+)(?<inline>.+?)\k<backticks>(?!`)/ 

, который использует нежадным матч.

Мне было интересно, смогу ли я избавиться от не-жадного матча.


Идея исходит из того, что запрещенный шаблон является единственным символом. Когда я хочу, чтобы соответствовать подстроку, которая окружена одной цитатой ', который не содержит апостроф в нем, я могу сделать что-либо:

/'.+?'/ 
/'[^']+'/ 

Первый использует не жадный матч, а второй использует явный шаблон несоответствия [^'].

Мне интересно, возможно ли иметь что-то вроде второй формы, когда запрещенный шаблон не является одним символом.


Возвращаясь к первоначальному вопросу, есть отрицательный предпросмотр синтаксис (?!), но я не могу ограничить его эффективную сферу. Если бы я сделать мое регулярное выражение как это:

/(?<!`)(?<backticks>`+)(?<inline>(?!.*\k<backticks>).*)\k<backticks>(?!`)/ 

то эффект (?!.*\k<backticks>) не будет ограничен в пределах (?<inline>...), но будет распространяться на всю строку. И поскольку это противоречит \k<backticks> в конце, регулярное выражение не соответствует.

Существует ли регулярное выражение для обеспечения несогласованности шаблона (не обязательно одного символа) в пределах определенной области?

ответ

1

Вы можете осуществлять поиск одного или нескольких символов, которые не являются первым символом разделителя:

/(?<!`)(?<backticks>`+)(?<inline>(?:(?!\k<backticks>).)+)\k<backticks>(?!`)/ 
+0

Это похоже на работу. Это красиво. – sawa

+0

Не может быть упрощено до '' '/ (? '+) (? (?: (?! \ K ).) +) \ K (?!')/' ''? Будет ли это эквивалентно? Насколько мне показалось, мне кажется. – sawa

+1

Да, гораздо приятнее. –