jjzjj

java 比较两个 Pattern 对象

coder 2024-03-10 原文

有没有一种简单的方法来比较两个 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 比较两个 Pattern 对象的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  4. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  5. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  6. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  7. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  8. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  9. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  10. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

随机推荐