Java 正则表达式中 w 和 b 的 Unicode 等效项?
与其他表达式相比,Java 正则表达式的字符类简写(w 和 b)有限现代正则表达式实现。在Java中,w仅匹配[A-Za-z0-9_],限制了单词匹配能力。此外,b 的词边界语义偏离了 w 和 Unicode 的定义。
Unicode 感知等效项
幸运的是,已经开发了自定义 Unicode 感知等效项来克服这些限制。以下是替换内容:
\s: [\u0009-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000] \S: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000] \v: [\u000A-\u000D\u0085\u2028\u2029] \V: [^\u000A-\u000D\u0085\u2028\u2029] \h: [\u0009\u0020\u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000] \H: [^\u0009\u0020\u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000] \w: [\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]] \W: [^\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]] \b: (?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]])) \B: (?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]])) \d: \p{Nd} \D: \P{Nd} \R: (?:(?>\u000D\u000A)|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]) \X: (?>\PM\pM*)
理解边界(b 和 B)
边界匹配单词字符转换为非单词字符的位置,反之亦然。边界定义为:
IF follows word THEN doesn't precede word ELSIF doesn't follow word THEN does precede word
转换为正则表达式语法:
(?:(?<=\w)(?!\w)|(?<!\w)(?=\w))
同样,非边界 (B) 等效项为:
(?:(?<=\w)(?=\w)|(?<!\w)(?!\w))
在 Java 中加入 Unicode 支持
至将这些 Unicode 等效项合并到 Java 正则表达式中,您可以在编译之前使用字符串重写函数来转换模式。以下是使用名为 rewrite 的自定义函数的示例:
String rewrittenPattern = rewrite(originalPattern); Pattern compiledPattern = Pattern.compile(rewrittenPattern);
以上是正则表达式中 Java 的 \w 和 \b 的 Unicode 等效项是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!