java 比较两个 Pattern 对象

标签 java regex

有没有一种简单的方法来比较两个 Pattern 对象?

我有一个 Pattern,它使用正则表达式 "//" 编译以检查代码中的注释。

由于有几种正则表达式来描述评论,我想找到一种方法来区分它们。

如何实现? Pattern 类没有实现 equals 方法。

最佳答案

您可以通过比较调用 pattern()toString 的结果来比较 Pattern 对象,但这并不能满足您的要求(如果我正确理解你的问题)。具体来说,这会比较传递给 Pattern.compile(...) 工厂方法的字符串。但是,这没有考虑单独传递给模式字符串的标志。

没有简单的方法可以测试两个不同的正则表达式是否等价。例如 ".+""..*" 表示等效的正则表达式,但是没有直接的方法使用 Pattern 来确定这一点> API。


我不知道这个问题在理论上是否可以解决...在一般情况下。 @Akim评论:

There is no finite axiomatization to regex equivalence, so the short answer is "this is not doable by tree transformations of the regexes themselves". However one can compare the languages of two automata (test their equality), so one can compute whether two regexes are equivalent. Note that I'm referring to the "genuine" regexes, with no extensions such as back-references to capture groups, which escape the realm of rational languages, i.e., that of automata.


我也想对已接受的答案发表评论。作者提供了一些代码,他声称​​显示 Pattern 的equals 方法是从Object 继承的。事实上,他看到的输出与那个一致......但它没有显示它。

了解是否属于这种情况的正确方法是查看 javadoc ... 其中 equals 方法列在继承方法列表中。这是确定的。

那么为什么示例没有显示作者所说的内容呢?

  1. 两种方法的行为方式可能相同,但实现方式不同。如果我们将 Pattern 类视为黑盒,那么我们无法证明这没有发生。 (或者至少......不是没有使用反射。)

  2. 作者只在一个平台上运行过它。其他平台的行为可能有所不同。

关于第二点,我记得在 Pattern 的早期实现中(在 Java 1.4 中)Pattern.compile(...) 方法保留了一个缓存最近编译的模式对象1。如果您编译了一个特定的模式字符串两次,那么第二次您可能会得到与第一次返回的相同的对象。这将导致测试代码输出:

  true
  true
  true
  true

但这说明了什么?它是否表明 Pattern 覆盖了 Object.equals?不!

这里的教训是,您应该通过查看 javadoc 了解 Java 库方法的行为主要:

  • 如果您编写“黑盒”测试,您可能会得出不正确的结论……或者至少得出的结论可能并非对所有平台都适用。

  • 如果您的结论基于“阅读代码”,则可能会得出对其他平台无效的结论。


1 - 即使我的记忆不正确,这样的实现也与 Pattern.compile(...) 方法的 javadoc 一致。他们并没有说每个 compile 调用都会返回一个新的 Pattern 对象。

关于java 比较两个 Pattern 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10055034/

相关文章:

java - 在 AJAX 响应中返回 JSP?

java - Android 字符串替换全部不起作用

java - 在 Java 中,如何确定多个值之一是否位于数组中?

python - mongodb 仅显示列表中的特定值

正则表达式到期日期 MM/YYYY

java - 单击 jsp <span> 树元素

java - Java正则表达式中的最大组数

regex - 如何仅匹配整个单词并忽略特殊字符

javascript - jQuery:使用 'name_lastName@company.com' 格式的电子邮件验证

java - 并发读取共享对象中的只读字段并写入读/写字段