Ошибка регулярного выражения XQuery - PullRequest
1 голос
/ 16 февраля 2010

Почему следующий код возвращает true (Saxon-EE 9.2 для .NET)?

matches('some text>', '^[\w ]{3,200}$')

В шаблоне нет символа>. Спасибо.

XQuery:

<regexp-test>
    <!-- why true? -->
    <test1>{matches('some text>', '^[\w ]{3,200}$')}</test1>
    <test2>{matches('some text>', '^[\w ]+$')}</test2>
    <test3>{matches('&lt; < >', '^[\w ]+$')}</test3>
    <!-- valid: --> 
    <test4>{matches('some text!', '^[\w ]+$')}</test4>  
    <test5>{matches('.,', '^[\w ]+$')}</test5> 
</regexp-test>

Выход:

<regexp-test>
  <!-- why true? -->
  <test1>true</test1>
  <test2>true</test2>
  <test3>true</test3>
  <!-- valid: -->
  <test4>false</test4>
  <test5>false</test5>
</regexp-test>

Ответы [ 3 ]

1 голос
/ 03 мая 2010

После некоторых копаний, экспериментов и помощи других членов сообщества eXist я обнаружил, что определение классов символов в UNICODE, которое используется в определении регулярных выражений в XPath и схеме XML, отличается от классов POSIX. В частности персонажи

$ + <=> ^ | ~

находятся в классе Symbol \ p {S}, а не в классе пунктуации \ p {P}. Поскольку определение \ w (из http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes-with-errata.html) равно

"[# x0000- # x10FFFF] - [\ p {P} \ p {Z} \ p {C}] (все символы, кроме набора знаков пунктуации, разделителя и других символов)

эти символы будут включены в \ w

Это приводит к обходному пути использования [^ \ W \ p {S}]

0 голосов
/ 24 февраля 2010

> не является допустимым символом в строке в этой ситуации и должен быть заменен его представлением &gt;. Я предполагаю, что это молча отбрасывается, и поэтому регулярное выражение совпадает.

См. Также w3schools.com : «XQuery чувствителен к регистру, а элементы, атрибуты и переменные XQuery должны быть действительными именами XML». - и > не допускается внутри атрибутов XML.

0 голосов
/ 23 февраля 2010

Я пойду ...

Я догадываюсь, что ты хотел написать

matches( 'some text' , '^[\w ]{3,200}$' )

Регулярное выражение говорит, что начинается в начале строки (^), соответствует не менее 3 и не более 200 ({3,200}) символов или пробелов ([\w ]), а затем ожидает конца строка ($).

Итак, some text вернет true, так как состоит из правильных символов [a-zA-Z0-9_ ] и их 9.

Если это совпадение, например

matches( 'some text' , '^[\w ]{3,5}$' )

Результат должен вернуть false, поскольку он будет соответствовать только строкам длиной от 3 до 5.

Возможно, вы думаете, \w означает пробел или что-то еще?

...