【问题标题】:Are \A \z in String#matches redundant?String#matches 中的 \A \z 是多余的吗?
【发布时间】:2018-09-13 14:06:00
【问题描述】:

在 java String 类中,matches 测试字符串是否与正则表达式模式匹配。所以显然它是针对正则表达式模式的整个字符串,这是否意味着 \A, \z, ^, $ 在这里是多余的?

如果不是,请提供示例说明为什么在这种情况下它们不是多余的。

【问题讨论】:

  • 我赞成你的答案,因为我无法轻易地挖掘源代码来支持潜在的答案。但是see here 的讨论与您的问题非常相似。长话短说,String#matches(依次调用Pattern#matches)默认匹配整个字符串。如果您不想要这种行为,请改用Matcher#find,就像您以前可能做过的那样。
  • 但我记得有一个警告,我必须深入挖掘。

标签: java regex


【解决方案1】:

除非您激活 multiline mode,否则它们是多余的,在这种情况下,^$ 将匹配单个 的开头和结尾,而不是整个输入。

您可以在使用String#matches 时激活多行模式,方法是使用正则表达式内的嵌入标志表达式(?m)(通常在开头)。

【讨论】:

  • 好答案,但我无法匹配多行字符串,除非我使用 DOT ALL 模式(顺便说一下,这是(?s),而不是(?m))。
  • String#matches 只匹配整个字符串,多行模式在那里是不可能的。
  • @WiktorStribiżew 有点像。如果您有一个带有换行符的字符串,并且您希望String#matches 工作,那么您需要(?s) 才能获得匹配。
  • @TimBiegeleisen 你把事情搞糊涂了。 4castle 在^$ 锚点的上下文中提到了Pattern.MULTILINE 选项。
  • @WiktorStribiżew Here's an example 在 String.matches 中使用多行模式。
猜你喜欢
  • 1970-01-01
  • 2016-01-07
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多