【问题标题】:Why java fails regex expression为什么java失败正则表达式
【发布时间】:2013-12-10 17:31:41
【问题描述】:

我用 regex str.matches("\\D+") 写了一个条件,用 Scanner 读取,但在输入 char+digit 时,这个测试失败,例如 3x 或 e3,但它不应该发生。 它应该在字符串的任何地方传递任何非数字出现,即使它是一个符号。

【问题讨论】:

  • 为什么会通过? \D 是非数字字符。
  • 至少有一次非数字出现应该是我的意思,应该通过。
  • "str" 是使用 Scanner 类读取的字符串

标签: java regex


【解决方案1】:

如果mMatcher,则m.matches 仅在整个 字符串与模式匹配时才返回true。如果您只想检查字符串的某些部分是否匹配,可以使用m.find 而不是m.matches。 (注意:我不确定这是否真的是您遇到的问题。)

【讨论】:

  • find(),不是 JDK 方法。
  • @Prashant 是Matcher 类的方法,但你是对的,它不是String 类方法,而matches 是两者的方法。如果你真的要使用String 版本,请将.* 放在模式的两端。
【解决方案2】:

至少应该出现一次非数字出现,这就是我所说的,应该通过

这个怎么样

.*\D.*

你可以test it here

【讨论】:

  • 非数字出现应该出现在任何地方,这意味着您可以在之前或之后拥有其他任何东西。 +1++11+1。如果.* 太宽泛,您只需将.* 替换为适当的正则表达式即可。
  • 阅读正则表达式的好来源,因为大多数文章都没有拆分示例和解释。
【解决方案3】:

此调用无法匹配3e,因为:

str.matches("\\D+")

等同于:

str.matches("^\\D+$")

因为String#matches 采用给定的正则表达式并匹配完整的输入。

为确保至少有一个非数字,您最好使用这个基于前瞻的正则表达式:

str.matches("(?=\\d*\\D).*")

(?=\\d*\\D) 是正向前瞻,确保给定输入中至少有 1 个非数字。

【讨论】:

    【解决方案4】:

    \D 匹配任何非数字字符,所以如果你传递一个包含数字的字符串,它当然会失败。

    如果您只想匹配字符和数字,您可以执行以下操作:

    matches("[a-zA-Z0-9"]+);
    

    【讨论】:

    • 我只想在字符串中的任何地方传递一个非数字出现,即使它是一个符号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多