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

5

我有一些模式/匹配器行,可以将输入字符串转换为如下形式:

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。由于输入是字符串,我无法使用任何正则表达式来获取这个负数。

在下面的代码中,我使用了:

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

我需要将该字符串转换为整数,这正是我所需的。

你能想出一种方法让我将“-”字符和数字字符放在一起吗?然后,我只需检查是否有“-”字符来转换数字并乘以“-1”即可。(如果有更好的方法,我很乐意听取意见)。

通常情况下,请原谅我的英语。


1
不需要为你的英语道歉,它已经很好了。 :-) 返回翻译后的文本即可。 - Ken White
你能否只按空格分割并正常解析?为什么要使用正则表达式? - Dave Newton
@DaveNewton想要捕获[]中的序列作为标记,即使它们包含空格。(但我也喜欢无正则表达式的方法!) - cheeken
@cheeken 我的意思是在捕获组之后。个人认为这更适合使用实际解析器而不是正则表达式,尽管如果情况不太复杂,也许这并不重要。 - Dave Newton
很难回答这个问题 - 你应该提供一个简单的描述,说明你想用这个正则表达式匹配的完整效果,以及可能不匹配的一些边缘情况。 - FrankieTheKneeMan
显示剩余2条评论
4个回答

3

您完全可以使用正则表达式来捕获负数,但这取决于您想要排除的内容。

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

最简单的方法是将“-”添加到识别的单词字符组中。但是,这也会导致类似于“9-9”这样的奇怪形式变为合法。考虑到您已经匹配了像“9_9”这样的标记,我不确定这对您是否构成问题。我可能会在这个正则表达式的末尾添加另一个选择:
"(?<=\\[)[^\\]]+|\\w+|-?\\d+"

这允许可选的' - '字符后跟至少一个数字。或者,一个负数。这是相当健壮的——你只是定义了一种附加类型的匹配(非常特定),但每次找到一个新的情况时,你真的不应该只是不断地添加'|...'到你的正则表达式结尾。这是做你正在做的事情的最不有效率的方式。在你现在的情况下,似乎这并不是一个问题,但随着你的用例增加,你应该考虑这个问题。


嗯,这比我想象的要容易。我试图绕过并在 \w+(\w+\-)之后包含“-”字符,但效果不佳。我只是想到,既然我得到的是一个字符串,我就无法将数字评估为正数或负数。 我想我只需要多尝试几次,然后再上网问问,吸取教训。非常感谢大家。 - afontcu

3

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

-?表示正则表达式中的单词(\\w+)前面可以有或没有“-”,但如果只需要数字,则使用\\d+\\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);

}

如您所预期的,它返回[-1, 3, Hi, 2, 1, 4]


1
您可以在正则表达式中使用可选的-
Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|-?\\w+");

0
非常花哨的正则表达式,但是有没有一些更简单的方式可以捕获您想要做的事情呢?
(?:\[(?:\s*[-]?\d+\s*)*\]|(?:[-]?\d+|\w+))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接