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

时间:2012-11-17 00:51:32

标签: java regex pattern-matching negative-number

我有像这样转换输入字符串的模式/匹配器行:

1 3 Hi [2 1 4]

进入这样的数组:

[0] => "1"
[1] => "3"
[2] => "Hi"
[3] => "2 1 4"

这就是代码:

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());

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

下面的代码中,我使用

Integer.parseInt(cIn.get(0)); 

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

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

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

4 个答案:

答案 0 :(得分:3)

你绝对可以使用正则表达式来捕获负数,但这取决于你想要清除的东西。

"(?<=\\[)[^\\]]+|[-\\w]+"

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

"(?<=\\[)[^\\]]+|\\w+|-?\\d+"

允许使用可选的' - '字符,后跟至少一个数字。或者,负数。这是非常强大的 - 你只是定义了另一种类型的匹配(非常具体),但每次你找到一个新的情况,你真的不应该只是继续添加'| ...'到结尾你的正则表达式。这是关于做你正在做的事情的效率最低的方法。在您的情况下,似乎这不是一个真正的问题,但是当您的用例扩展时,您应该考虑这一点。

答案 1 :(得分:3)

方法如下:(?<=\\[)[^\\]]+|-?\\w+

-?正则表达式意味着您可以在单词(-)之前加\\w+,但如果只需要数字,则使用\\d+和{{1 }}

这是我写的测试:

\\w+

按预期产生@Test public void regex() { String input = "-1 3 Hi [2 1 4]"; Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|-?\\w+"); Matcher m = p.matcher(input); List<String> cIn = new ArrayList<String>(); while (m.find()) cIn.add(m.group()); System.out.println(cIn); }

答案 2 :(得分:1)

您可以在正则表达式中使用可选的-

Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|-?\\w+");

答案 3 :(得分:0)

非常花哨的正则表达式,但是那些捕获你想要做的事情的技巧更少呢?

(?:\[(?:\s*[-]?\d+\s*)*\]|(?:[-]?\d+|\w+))