为了账号安全,请及时绑定邮箱和手机立即绑定

Java 正则表达式是否支持整理序列?

Java 正则表达式是否支持整理序列?

POPMUISE 2021-11-11 14:14:43
我正在([[.ch.]]*)c针对测试字符串尝试正则表达式chchch。根据规范:[[.ch.]]*c 匹配字符串 chchch 中的第一个到第五个字符当我在 Java 中测试它时,它确实匹配了这些字符,但[[ch]]*c. 因此,我不确定是否尊重整理符号。是吗?
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

你正在读/报价是The Open Group的SUS(规格小号英格尔ü NIX®小号pecification)IEEE的POSIX(的正则表达式部分的版本P ortable Ø操作摄像机小号ystem覆盖整个院落为UNI X)的标准集合。(见https://www.regular-expressions.info/posix.html ¹)

在一般情况下,符合POSIX标准的唯一的正则表达式引擎完全支持POSIX括号表达式,基本上什么其他的正则表达式的口味调用字符类,但有一些特殊的功能,其中之一是[..]使用时,被解释为开始和整理序列结束表达式中。

不幸的是,很少有正则表达式引擎是 POSIX 兼容的,事实上,一些声称实现 POSIX 正则表达式的引擎只是使用 POSIX 定义的正则表达式语法,并且没有完整的语言环境支持。因此,他们没有实现所有/任何括号表达式功能/怪癖。

Java 的正则表达式绝不是 POSIX 兼容的,从这个正则表达式引擎比较图表²可以看出。它的regex包实现了一个“类似 Perl”的正则表达式引擎,缺少一些功能(例如条件表达式和注释),但包括一些额外的功能(例如所有格量词和可变长度但有限的后视断言)。

Perl 和 Java 都不支持与整理相关的括号定界符[=and =](字符等价),或[..](整理序列)。Perl 确实支持使用 POSIX[::]定界符的字符类,但 Java 仅支持使用\p操作符的字符类(这里有一些注意事项)。


那么,[[.ch.]]*cJava 中的正则表达式是怎么回事?(我忽略了捕获组,因为它不会改变分析。)

好吧,事实证明 Java 的regex包在其字符类中支持联合。这是通过嵌套实现的。例如,相当于其中的字符是 中的字符和 中的字符的并集。(顺便说一句,请注意,并且也会产生相同的结果。)[set1[set2]][set3]set3set1set2[[set1][set2]][[set1]set2]

因此,[[.ch.]]只是包含空字符集与字符类中字符集的并集的字符类[.ch.],因此基本上与字符类相同[.ch.]。这等效于[.ch](因为第二个.是多余的),因此[[.ch.]]*c[.ch]*c.

类似地,[[ch]]*c简化为[ch]*c

最后,由于.string中没有任何字符chchch,正则表达式[.ch]*c[ch]*c将产生相同的结果。(尝试对字符串c.hchch进行测试以查看差异并证明上述内容。)


笔记:

这不是演示整理序列或检测它们是否被实现的一个很好的例子,因为在支持整理序列(并且是当前语言环境中的有效序列)和它们不是但联合时都[[.ch.]]*c将匹配。chchcchchchch

一个更好的演示/测试是将正则表达式[[.ch.]]与测试字符串一起使用ch

  • 如果ch匹配,则支持整理序列。

  • 任何其他匹配都意味着它们不是。

  • 如果返回错误,则可能会支持它们,因为如果ch不是当前语言环境中的有效序列(这是捷克语语言环境中的有效整理序列),则会发生这种情况:

    • 如果错误指定将ch不是有效的整理顺序,那么他们支持。

    • 如果返回的错误是分隔符/令牌[.和/或.]无效/不受支持,则不支持整理序列。

    • 如果错误不明确,或者为了确保检查支持的方式,您需要切换到捷克语语言环境(并确认它ch确实是一个有效的整理序列)或切换到至少具有一个已定义整理序列的任何其他语言环境可以用来代替ch.


¹我既不是 Jan Goyvaerts,也绝不隶属于 Regular-Expressions.info 网站。
²我也不是CMCDragonkai。


查看完整回答
反对 回复 2021-11-11
  • 1 回答
  • 0 关注
  • 160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信