【问题标题】:Java Regex won't match, any explanations?Java Regex 不匹配,有什么解释吗?
【发布时间】:2011-04-25 00:47:07
【问题描述】:

正则表达式String

"[Ff][uU][Nn][Cc] " 

匹配输入:

"fUnC " 

但不是:

"func across( a, b )"

我不明白为什么...

我在这里测试我的表达方式: http://www.regexplanet.com/simple/index.html

我发现我(愚蠢地)需要我的正则表达式为 "[Ff][uU][Nn][Cc] .*" 才能匹配。

已解决:如果您正在寻找相当于子匹配的内容,请不要使用便捷方法Pattern.Matches(regex, input)。您应该改用Matcher.find() 方法。

【问题讨论】:

  • 我不是要匹配整个字符串,只是测试是否可以在字符串中检测到符号“func”。
  • 为什么不使用使正则表达式不区分大小写的选项?
  • 这样会更干净,但是没有用。使用测试站点(和我自己的代码)获得匹配的唯一方法是在最后使用.*
  • Java 的 Pattern.Matches(regex, input) 显然试图只匹配整个字符串。另外,你不能在使用 Pattern.Matches 时设置标志,所以我没有区分大小写。
  • 如您所见,Java 的matches 方法与其说是一种方便的方法,不如说是一种不方便的方法。 :) 你不是第一个被 Java 对 matches 一词的奇怪重新定义绊倒的人。还有plenty of other gotchas。 :(

标签: java regex


【解决方案1】:

当我使用您链接到的正则表达式测试器时,我发现您的正则表达式可以与 find() 一起使用,但不能与 match() 一起使用。这是我所期望的—— find() 只是在目标字符串中查找正则表达式命中,而 matches() 总是尝试匹配整个字符串。

【讨论】:

  • 没有办法像艰难的方式那样学习,哈哈。我会修改代码。
【解决方案2】:

"[Ff][uU][Nn][Cc].*" 可能会有所帮助...

【讨论】:

  • 它应该匹配没有.*,因为func 匹配模式。
  • 我的错误在于忘记匹配是惰性的。当然,我可能会匹配部分字符串,但不是全部。我现在可以工作了...
  • 是的。但 'func across...' 没有。
【解决方案3】:

它可以....它工作正常。但是你的字符串在那里,你会看到 MATCHES 是错误的,但是 replaceFirst 和 ReplaceAll 工作正常。

如果您希望 MATCHES 为真

最后加一个*

【讨论】:

    【解决方案4】:

    您是否也尝试过使用正则表达式测试器,忽略大小写?应该有一种方法可以在 Java 正则表达式匹配器中打开不区分大小写。

    【讨论】:

    • 在使用便捷方法Pattern.Matches(regex, input) 时不会。您只能在手动操作时使用这些标志。
    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2012-03-26
    相关资源
    最近更新 更多