代码之家  ›  专栏  ›  技术社区  ›  Adrien Aacha

我的正则表达式与某个输入不匹配-java

  •  1
  • Adrien Aacha  · 技术社区  · 8 年前

    我使用以下正则表达式:“(?([0-9]+)-?)+”。

    我试着看看两个数字之间是否有负号。正则表达式应允许数字前有负数,但不允许数字之间有负数。

    我用以下命令行输入测试它:“4 6 8 2 5-3 4 3 9”,程序返回预期返回的值(布尔值为true)。

    Exception in thread "main" java.lang.NumberFormatException: For input string: "5-3"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.lang.Integer.parseInt(Integer.java:580)
        at java.lang.Integer.parseInt(Integer.java:615)
        at Ex5.main(Ex5.java:32)
    

    这意味着我的布尔值为false,我不知道为什么,因为它应该返回true。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Wiktor Stribiżew    8 年前

    请看一下你的 ( ?([0-9]+)-?)+ regex demo :仅限 4 6 8 2 5-3 4 3 9 线作为一个整体匹配,而 4 -6 8 2 5-3 4 3 9 , -4 6 8 2 5 -3 4 3 9 4 -6 8 2 5-3 4 3 9 部分匹配。

    如果你得到 ,表示您正在使用 .matches() 方法您可以使用

    (?: ?-?([0-9]+))+
    

    regex demo .

    以获得与当前相同的功能,如果您将其与 .匹配() ,您将匹配上面提供的所有四个字符串,组1将包含捕获的最后一块数字(由于模式包含重复捕获组,因此只有最后一个数字将存储在 .group(1) ).

    细节

    • ^ (暗示于 .匹配() )-字符串开始
    • (?: ?-?([0-9]+))+ -1次或多次出现:
      • ? -可选空间
      • -? -可选 ?
      • ([0-9]+) -第1组:一个或多个数字
    • $ (暗示于 .匹配() )-字符串结束
        2
  •  0
  •   user3795373    8 年前

    你可以试试 ((\s)?\d+(-\d)?)+ 它适用于所有情况。如果有失败的案例,请告诉我。 对于Java代码,可以使用 ((\s)?\d+(\-\ d)?)+