Как указать, какая часть регулярного выражения имеет приоритет, когда сталкивается с неоднозначностью? - PullRequest
1 голос
/ 22 февраля 2012

У меня есть регулярное выражение с двумя именованными частями и необязательный разделитель дефисов.

^(?<Left>xxx)-?(?<Right>yyy)$
(я упростил фактическое регулярное выражение вниз. Вместо 'xxx' и 'yyy' представьте себедва действительно длинных и сложных регулярных выражения.)

Однако, поскольку дефис необязателен, существуют входные строки, в которые подразумеваемый разделитель может быть добавлен в разные места.Есть ли способ, которым я могу разрешить неоднозначность, сказав, что Left или Right должны занимать большую долю входной строки?

Например, для входа "ABCDEF", который может быть разделен как "ABC" /«DEF» или «ABCDE» / «F», причем оба являются действительными совпадениями двух подвыражений.Скажем, я предпочитаю второе разделение, потому что я хочу, чтобы 'Left' брал самый большой кусок, который может, пока в 'Right' оставлен допустимый остаток.

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

1 Ответ

1 голос
/ 22 февраля 2012

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

Вы можете изменить поведение соответствия ваших квантификаторов внутри каждого регулярного выражения, чтобы изменить результат.

По умолчанию онивсе жадные.Вы можете изменить это поведение соответствия, насколько это возможно, чтобы соответствовать как можно меньше, добавив знак вопроса после квантификатора, например, .+?.

\(.*\) будет соответствовать

(a)b(c)
^^^^^^^

в то время как \(.*?\) будет соответствовать

(a)b(c)
^^^ 
...