regex - 具有多字符 unicode 符号的正则表达式匹配行为
问题描述
我无法理解使用多字符 unicode 符号观察到的一些行为。
以 string和 regex为例,
(|)(?![])
我得到三个匹配项:两个标志和最后一手。预期: 5 次匹配,每个符号一次。
由于 和 都是 2 个字符符号,因此我尝试编写一个非 unicode 示例。使用 stringabcdabcdab
和 regex (ab|cd)(?![b])
,我得到了预期的 5 个匹配项,每对ab
和cd
一次。
考虑到and之间可能存在一些交互
,我使用了不同的 unicode 字符,给了我 regex
(|)(?![])
。在这里,我得到了与第一个示例中相同的结果。
由于两者和
通常不单独使用,我尝试使用“普通” unicode 或 ASCII 字符而不是
. 在我的示例中,我使用了
and
a
,这给了我 5 次匹配的预期结果,每个符号一次。
有人能够解释这种行为,还是这是一个错误?
此行为仅发生在 PCRE 和 JavaScript 正则表达式引擎中,我使用此站点对其进行了测试。https://regex101.com/
解决方案
您不应该将多字节字符放在像 in 这样的字符类中(?![])
。在字符类中,它被“分解”为两个字节的序列, \uD83C
并且\uDFFE
匹配其中任何一个,而不是作为序列。由于手形表情符号是一系列\uD83E\uDD1A\uD83C\uDFFE
(以这两个字节结尾),因此触发了前瞻并影响了匹配。
要解决此问题,您只需删除括号并使用(|)(?!)
,以便将char 视为字节序列,而不是一个或另一个 char。
推荐阅读
- html - 是否可以一次使用样式(自动宽度或高度)调整 HTML 中的所有元素(标签)?
- c# - 是否可以将路由组件与 Blazor WASM 中的客户端应用程序放在单独的项目中?
- c# - 数据未出现在链接表中(子类别和产品)
- firebase - 如何在 expo 的 React Native 天才聊天中设置用户头像?
- python - FileNotFoundError:[Errno 2] 卡住
- regex - 简单的正则表达式未捕获捕获组
- java - 试图从类别等于字符串的firebase中检索数据
- python - Python:分配变量路径的文件不打印或编辑
- vue.js - Vue3 范围类不适用于模板中未声明的元素
- python - 如何在调用视图函数的模板中编写 urlpattern