2017-10-18 161 views
1

我使用以下正则表达式:“(?([0-9] +) - ?)+”。我的正则表达式与某个输入不匹配 - java

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

我用下面的命令行输入测试它:“4 6 8 2 5-3 4 3 9”,程序返回它期望返回的内容(true为一个布尔值)。 另外,当命令行输入是:“-4 6 8 2 5 -3 4 3 9”时,程序工作并将假返回到布尔值(预期)。但是,每当我输入:“4 -6 8 2 4月5日至3日3月9日”,程序将显示以下错误:

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) 

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

+0

阿德里安,只是一个提示,而不是把所有的代码中的问题,限制你的单片代码的问题。例如:为什么正则表达式“(?([0-9] +) - ?)+”不匹配输入‘4-6 8 2 4月5日至3日3月9日’ – Doleron

+0

你能使用'布尔hasMinuses = listString.contains(‘ - ’)'如果是这样,这将节省您的调试。正则表达式 – dave

+0

哦,不,我不能,我想允许 - 但只有当它的一些 –

回答

1

请看看你的(?([0-9]+)-?)+ regex demo:虽然4 -6 8 2 5-3 4 3 9-4 6 8 2 5 -3 4 3 94 -6 8 2 5-3 4 3 9是部分匹配的只有4 6 8 2 5-3 4 3 9线相匹配的整体利益。

如果您获得false,这意味着您正在使用.matches()方法。您可以使用

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

看到这个regex demo

为了获得与当前相同的功能,并且如果将它与.matches()一起使用,您将匹配上面提供的所有四个字符串,而组1将包含最后一批捕获的数字(因为该模式包含重复捕获组,只有最后一个号码将被存储在.group(1))。

详细

  • ^(隐含在.matches()) - 串的开始
  • (?: ?-?([0-9]+))+ - 1个或多个的:
    • ? - 任选的空间
    • -? - 一个可选?
    • ([0-9]+) - 第1组:一个或多个数字
  • $(在.matches()暗示) - 字符串的结尾
+0

它的效果比上次更差!现在,无论输入什么值,布​​尔值都是正确的,即使只是“4 5 6 9”“8 63 3” –

+0

@AdrienAacha您还没有解释它应该如何工作。您只抱怨3条线路没有匹配。我解释了为什么,并提出了一个模式。 –

+0

我已经明确地说,如果减号是两个号码而不是在它介于它应返回true一个布尔值只是一些 –

0

您可以尝试((\ s)\ d +( - \ d? )?)+ 它适用于所有情况。请让我知道是否有任何案件失败。 对于Java代码,你可以使用((\ s)\ d +(\ - ?\ d))+