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. (如果有更好的方法,我会很高兴听到)。

像往常一样,对不起我的英语。

4

4 回答 4

3

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

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

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

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

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

于 2012-11-17T01:05:36.040 回答
3

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

-?则表达式意味着您可以-在单词 ( \\w+) 之前有或没有,但如果您只需要数字,则使用\\d+and \\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]会如您所愿。

于 2012-11-17T01:08:35.110 回答
1

你可以在你的正则表达式中使用一个可选-的:

Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|-?\\w+");
于 2012-11-17T01:05:47.737 回答
0

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

(?:\[(?:\s*[-]?\d+\s*)*\]|(?:[-]?\d+|\w+))
于 2012-11-17T01:18:31.223 回答