首页 > 解决方案 > 具有多字符 unicode 符号的正则表达式匹配行为

问题描述

我无法理解使用多字符 unicode 符号观察到的一些行为。

以 string和 regex为例,(|)(?![])我得到三个匹配项:两个标志和最后一手。预期: 5 次匹配,每个符号一次。

由于 和 都是 2 个字符符号,因此我尝试编写一个非 unicode 示例。使用 stringabcdabcdab和 regex (ab|cd)(?![b]),我得到了预期的 5 个匹配项,每对abcd一次。

考虑到and之间可能存在一些交互,我使用了不同的 unicode 字符,给了我 regex (|)(?![])。在这里,我得到了与第一个示例中相同的结果。

由于两者通常不单独使用,我尝试使用“普通” unicode 或 ASCII 字符而不是. 在我的示例中,我使用了and a,这给了我 5 次匹配的预期结果,每个符号一次。

有人能够解释这种行为,还是这是一个错误?

此行为仅发生在 PCRE 和 JavaScript 正则表达式引擎中,我使用此站点对其进行了测试。https://regex101.com/

标签: regexunicodepcre

解决方案


您不应该将多字节字符放在像 in 这样的字符类中(?![])。在字符类中,它被“分解”为两个字节的序列, \uD83C并且\uDFFE 匹配其中任何一个,而不是作为序列。由于手形表情符号是一系列\uD83E\uDD1A\uD83C\uDFFE(以这两个字节结尾),因此触发了前瞻并影响了匹配。

要解决此问题,您只需删除括号并使用(|)(?!),以便将char 视为字节序列,而不是一个或另一个 char。


推荐阅读