2010-02-15 27 views
1

为什么下一个代码返回true(Saxon-EE 9.2 for .NET)?XQuery正则表达式错误

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> 
+0

我认为,我们需要查看更多的代码。无法从您提供给我们的信息中判断出了什么问题。 – 2010-02-16 11:50:13

+0

有什么资料? 我写了一个模式,示例文本,XQuery compliler!还有什么? – chardex 2010-02-19 09:29:26

+0

这个模式绝对不应该匹配,因为'>'不是'\ w'的一部分。所以,正如艾伦摩尔所说,这个问题可能是其他地方 - 请发布一个完整的代码示例,可以重现该问题。 – 2010-02-23 10:05:29

回答

1

经过eXist社区其他人的一些挖掘,实验和帮助,我发现UNICODE中定义字符类并用于定义XPath和XML模式中的正则表达式与POSIX类不同。特别地,字符

$ + < =>^|〜

在符号类\ 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

我将有一个去...

我会想你的意思是写

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

正则表达式开始于beginn (^),匹配至少3个,最多200个({3,200})字符或空格([\w ]),然后期望字符串的末尾($)。

因此,some text将返回true,因为它包含正确的字符[a-zA-Z0-9_ ]并且有9个。

如果比赛是这样的,例如

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

结果应该返回false,因为它只会匹配长度为3的字符串5

也许你觉得\w指空格或其他什么东西?

+0

我觉得提问者对文本中的“>”存在着疑惑,但不是在模式中。 – AakashM 2010-02-23 09:33:31

+0

谢谢你,我知道你描述的正则表达式及其基础。但它不是一个错字,我的意思是它是一个带有“>”(或其他符号,而不是字符:>,<,!,=等)的字符串。该模式没有这些字符,但字符串“一些文本”匹配。 在.NET或Java中正则表达式的实现中,相同的模式正常工作。但是在撒克逊人中,错误的是正确的。 – chardex 2010-02-23 14:11:36

0

>在这种情况下不是字符串中的有效字符,需要用它的表示&gt;来代替。我想它正在悄然下降,因此正则表达式匹配。

另请参见w3schools.com:“XQuery区分大小写,且XQuery元素,属性和变量必须是有效的XML名称。” - 和>不允许在XML属性内。

+0

当>用>取代时,我得到了相同的结果。匹配('< < >','^ [\ w] + $') - 返回true。 – chardex 2010-02-24 08:34:00

+0

'匹配('>','^ [\ w] + $')'会发生什么? – 2010-02-24 09:19:10

+0

它返回true。 – chardex 2010-02-24 10:28:47