【问题标题】:Integer in String with 1 or 2 digits具有 1 位或 2 位数字的 String 中的整数
【发布时间】:2015-06-11 22:40:41
【问题描述】:

对不起,我不知道你是否明白我想要做什么,我也不能 100% 确定它是否可以通过正则表达式完成,但也许有比我想到的更好的解决方案。

我想创建一个函数,它获取一个字符串作为参数并检查该字符串中是否有一个整数(这是简单的部分) 如果有一个整数,但超过 2 位或数字被拆分,则该函数应返回 false。

有效:

  • foo1bar
  • foobar1
  • f12obar
  • 12foobar

无效

  • f1o2obar
  • f1o23obar

所以简单的部分,1 位或 2 位数字的正则表达式没什么大不了的

[0-9]{1,2}

另一种方式,我认为是非常糟糕的代码,是循环遍历整个 String 并计算每个 int。一旦我看到一个并且下一个不是 int,该字符串中的每个其他 int 都会导致结束。

我希望有一个更流畅的方法来做到这一点。

【问题讨论】:

    标签: java regex string int


    【解决方案1】:

    将所有非数字都替换为空,然后用该数字查看原始字符串是否包含它。

    String str = "foo1b2ar"; //starting string
    String num = str.replaceAll("[\\D]",""); //the number it contains
    return str.contains(num) && num.length() <= 2; //does the original have that number all together? and is it short?
    

    例子:

    "foo1bar" -> "1" -> 原文是否包含“1”?是的。

    "f1o23obar" -> "123" -> 原文是否包含“123”?没有。

    【讨论】:

      【解决方案2】:

      您可以使用以下成语将整个 String 与 1 个 1 位或 2 位数字匹配:

      String[] test = {
          "foo1bar",
          "foobar1",
          "f12obar",
          "12foobar",
          "f1o2obar",
          "f1o23obar"
      };
      for (String s: test) {
          //                   | matching the whole string
          //                   |       | non-digit, 0 or more times, reluctantly quantified
          //                   |       |     | 1 or 2 digits
          //                   |       |     |       | non digit, 0 or more times, 
          //                   |       |     |       | reluctantly quantified
          System.out.println(s.matches("\\D*?\\d{1,2}\\D*?"));
      }
      

      输出

      true
      true
      true
      true
      false
      false
      

      【讨论】:

        【解决方案3】:

        Regex:

        [^0-9]*[0-9]{1,2}[^0-9]*
        

        您会注意到,在链接的演示中,我放置了^$ 锚点并使用了m 多行修饰符...这可能是必要的,也可能不是必要的,具体取决于您的实现。

        基本上,我正在寻找被 0+ 非数字包围的 1-2 位数字。

        【讨论】:

        • 也许我只是偏向于单行,但我更喜欢这个解决方案而不是当前的答案。 (另外,取决于 String.replaceAll()String.contains()(正则表达式与迭代搜索)在 Java 中的实现方式,纯正则表达式(有限自动机)可能会更快。)
        • 谢谢@River,不知道为什么有人反对它。我猜是因为我“不需要”使用正则表达式……但它确实解决了 OP 的问题
        • @MaxZoom 你有没有读过我的回答或try my demo?我在多行演示中包含了锚点,但取决于 OP 如何集成此表达式,它可能需要也可能不需要。
        • 不,我太懒了。但我现在读了它,它可能会起作用。您将如何在 Java 代码中使用它?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 2012-12-14
        相关资源
        最近更新 更多