2017-02-10 13 views
3

Большинство объяснений регулярных выражений обычно показывают, что ожидаемое поведение заключается в использовании жадной оценки выражений слева направо. Однако в одной реализации XQuery я обнаружил, что переменные выражения оцениваются параллельно (очевидно, для производительности), что означает, что «первое» совпадение не обязательно будет первым слева для соответствия.В регулярном выражении XSLT/XQuery есть ли требуемый порядок оценки переменных выражений?

Например, в каждом другом процессоре XQuery Я проверил, учитывая этот вход:

fn:analyze-string( 
    '1-a. x. y. z.', 
    '^(\d+[-\w]*\.?|.{1,10}\.)\s(.+)$', 
    'ix') 

Тот же вывод возвращается:

<analyze-string-result> 
    <match> 
     <group nr="1">1-a.</group> 
     <group nr="2">x. y. z.</group> 
    </match> 
</analyze-string-result> 

Однако существует один процессор XQuery, что (в группе 1) оценивает второе выражение перед первым, и оно соответствует:

<analyze-string-result> 
    <match> 
    <group nr="1">1-a. x. y.</group> 
    <group nr="2">z.</group> 
    </match> 
</analyze-string-result> 

Есть ли какая-либо интерпретация спецификации регулярного выражения для XQuery, где последний результат будет считаться действительным?

+0

Лучшая практика заключается в том, чтобы избежать использования ветвей, которые совпадают в одном месте. BTW, что такое процессор XQuery, который использует POSIX способ обработки чередования (второй)? –

+0

@ WiktorStribiżew Без поисковых запросов, которые очень сложно сделать для ввода, с которым мне приходится иметь дело. Я могу быть вынужден реорганизовать выражение в гораздо более крупное или разбить его на этапы, чтобы обеспечить приоритет. Это на MarkLogic. – wst

ответ

3

на основе https://www.w3.org/TR/xpath-functions-31/#func-analyze-string говоря

Если несколько альтернатив в рамках регулярного выражения как матч на той же позиции во входной строке, то матч, который выбран является первой альтернативой, которая соответствует. Например, если строка ввода равна The quick brown fox jumps, а регулярное выражение равно jump|jumps, то выбранным совпадением является jump.

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

+1

Второй результат - это только POSIX-совместимый, где самая длинная ветка «выигрывает». –

+0

Многие реализации XSLT и XQuery используют встроенную библиотеку регулярных выражений, и это часто приводит к несоответствующему поведению, к сожалению. –

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

  • Нет связанных вопросов^_^