是否可以构造与 3 个或更多非连续 UTF 代码点匹配的 PCRE UTF-8 正则表达式

Is it possible to construct a PCRE UTF-8 regex which matches 3 or more non-consecutive UTF codepoints

本文关键字:代码 UTF 连续 正则表达式 UTF-8 PCRE 是否      更新时间:2023-10-16

早上好,我们正在尝试使用 C/C++ PCRE 正则表达式"x{00F6}.*x{00E4}.*x{00E7}"匹配德语字符串 'DAS tausendsch'ne Jungfr¤ulein tausendschçne'。PCRE 正则表达式仅匹配一次,从字节位置 14 和 43 开始。我们的 PCRE 正则表达式是否正确或应该更正?谢谢。

您误解了返回的数据。

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] 标识 主题字符串的一部分与整个模式匹配。下一个 对用于第一个捕获子模式,依此类推。

下午好,我们刚刚发现了正确的 PCRE 正则表达式。(?=.+(\x{00F6})){1}(?=.+(\x{00E4})){1}(?=.+(\x{00E7})){1}

它匹配 DAS tausendschöne Jungfräulein ausendschçne at byte 位置 (14,16),(25,27)和(42,43)。问候,弗兰克