2014-11-21 3 views
1

У меня есть следующие Regex PatternRegex или шаблон не загружается матч

/string\s+(?|(x)|(ix|iv|v?i{0,3})|([a-j]))/i 

Когда я использую это с входом

String a 

Я не получить матч за a

Если я удалите середину or или переместите это условие на более раннее в шаблоне, оно подберет его.

http://regex101.com/r/uV3aL0/26

ли кто-то знает, что здесь происходит?

Благодарим за помощь.

ответ

1

Причиной такого поведения является промежуточный v?i{0,3} regex. Если вы измените свое регулярное выражение,

/string\s+(?|(x)|(ix|iv|v?i{1,3})|([a-j]))/i 

это сработает. NOrmally regex engine примет шаблон слева направо. Поэтому после string\s+ он принимает (x), но нет символа x, так что это не удастся. Затем идет до (ix|iv|v?i{0,3}) и занимает первое ix. Но нет ix или iv, поэтому они также терпят неудачу. Затем он принимает этот шаблон v?i{0,3}). Опционально v и i 0 до трех раз. Таким образом, промежуточная пустая строка будет сопоставлена. Итак, наконец, мы получили совпадение, и механизм регулярных выражений не будет использоваться для следующего условия ИЛИ.

+0

Это не соответствует 'v', в отличие от оригинала. – choroba

+0

@choroba я объяснил причину, если op хочет совместить 'string v', тогда он может использовать' string \ s + (? | (X) | (ix | iv | v? (?: i {1,3})?) | ([а ^])) ' –

2

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

v?i{0,3} 

Обратите внимание, что если v отсутствует и нет никакого i, он по-прежнему соответствует. Вы можете исправить проблему, добавив $ в конец регулярного выражения. Или, оптимизируйте римские цифры по-другому:

/string\s+(?|(i?[xv]|v?i{1,3})|([a-j]))/i 
Смежные вопросы