正则表达式模式匹配字符串中的正数和负数值

afo*_*tcu 5 java regex pattern-matching negative-number

我有模式/匹配行来转换输入字符串,如下所示:

1 3 Hi [2 1 4]
Run Code Online (Sandbox Code Playgroud)

进入这样的数组:

[0] => "1"
[1] => "3"
[2] => "Hi"
[3] => "2 1 4"
Run Code Online (Sandbox Code Playgroud)

那是代码:

String input = sc.nextLine();

Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|\\w+");
Matcher m = p.matcher(input);
List<String> cIn = new ArrayList<String>();
while(m.find()) cIn.add(m.group());
Run Code Online (Sandbox Code Playgroud)

现在我意识到有时候我会得到一些负值,输入就像4 2 -1 2.由于输入是一个String,我不能真正使用任何正则表达式来获得该负值.

我在下面的代码中使用

Integer.parseInt(cIn.get(0)); 
Run Code Online (Sandbox Code Playgroud)

将该字符串值转换为Integer,这实际上就是我需要的.

你能想出一种方法可以让我把-char和char数字保持在一起吗?然后我会检查是否有-字符转换数字并乘以它-1.(如果有更好的方式,我会很高兴听到).

像往常一样,请原谅我的英语.

Fra*_*Man 3

您绝对可以使用正则表达式来捕获负数,但这取决于您要消除的内容。

"(?<=\\[)[^\\]]+|[-\\w]+"
Run Code Online (Sandbox Code Playgroud)

最简单的方法是简单地将“-”添加到识别的单词字符组中。然而,这也会导致像“9-9”这样奇怪的阵型是合法的。考虑到您已经匹配了“9_9”等标记,我不确定这对您来说是个问题。我可能只是在这个正则表达式的末尾添加另一个替换:

"(?<=\\[)[^\\]]+|\\w+|-?\\d+"
Run Code Online (Sandbox Code Playgroud)

它允许可选的“-”字符后跟至少一位数字。或者,负数。这是相当健壮的 - 你实际上只是定义了一种额外的匹配类型(一种非常具体的匹配类型),但是每次你发现一个新的案例时,你真的不应该只是在末尾添加“|...”你的正则表达式。这是做你正在做的事情效率最低的方法。在您的情况下,这似乎并不是真正的问题,但您应该随着用例的扩展而考虑这一点。