早上好,我们正在尝试使用 C/C++ PCRE regex 匹配德语字符串 'DAS tausendschöne Jungfräulein tausendschçne' "\x{00F6}.*\x{00E4}.*\x{00E7}"
。PCRE 正则表达式仅从字节位置 14 和 43 开始匹配一次。我们的 PCRE 正则表达式是正确的还是应该更正?谢谢你。
问问题
150 次
2 回答
1
您误解了返回的数据。
PCRE 返回匹配的开始和结束位置。它在每种情况下只匹配一次,但匹配包括匹配的整个字符串,包括被“无聊”之类匹配的部分.*
。
因此,对于您的输入字符串,它与以下部分匹配:
DAS tausendschöne Jungfräulein tausendschçne
..............mmmmmmmmmmmmmmmmmmmmmmmmmmmm..
或者等效地匹配这些字节:
0 1 2 3 4 4
01234567890123456789012345678901234567890123456789
DAS tausendschöne Jungfräulein tausendschçne
..............mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm...
它的行为正确。来自http://www.pcre.org/pcre.txt:
当匹配成功时,有关捕获的子字符串的信息以整数对的形式返回,从 ovector 的开头开始,最多持续到其长度的三分之二。每对的第一个元素设置为子字符串中第一个字符的字节偏移量,第二个元素设置为子字符串末尾后第一个字符的字节偏移量。注意:这些值始终是字节偏移量,即使在 UTF-8 模式下也是如此。它们不是字符数。
第一对整数 ovector[0] 和 ovector[1] 标识与整个模式匹配的主题字符串部分。下一对用于第一个捕获子模式,依此类推。
于 2012-06-27T16:34:38.547 回答
0
下午好,我们刚刚发现了正确的 PCRE 正则表达式。(?=.+(\x{00F6})){1}(?=.+(\x{00E4})){1}(?=.+(\x{00E7})){1}
它在字节位置 (14,16)、(25,27) 和 (42,43) 处匹配 DAS tausendschöne Jungfräulein ausendschçne。问候, 弗兰克
于 2012-06-27T16:41:12.397 回答