2

getPolygonPoints() 方法(见下文)变成了一个字符串名称作为参数,看起来像这样:

points={{-100,100},{-120,60},{-80,60},{-100,100},{-100,100}}

第一个数字代表 x 坐标,第二个数字代表 y 坐标。例如,第一点是

x=-100
y=100

第二点是

x=-120
y=60

等等。

现在我想提取字符串的点并将它们放在一个 ArrayList 中,它最后必须看起来像这样:

[-100, 100, -120, 60, -80, 60, -100, 100, -100, 100]

这里的特殊之处在于,给定字符串中的点数会发生变化,并且并不总是相同。

我写了以下代码:

private ArrayList<Integer> getPolygonPoints(String name) {
    // the regular expression
    String regGroup = "[-]?[\\d]{1,3}";
    // compile the regular expression into a pattern
    Pattern regex = Pattern.compile("\\{(" + regGroup + ")");
    // the mather
    Matcher matcher;

    ArrayList<Integer> points = new ArrayList<Integer>();

    // matcher that will match the given input against the pattern
    matcher = regex.matcher(name);
    int i = 1;
    while(matcher.find()) {
        System.out.println(Integer.parseInt(matcher.group(i)));
        i++;
    }
    return points;
}

第一个 x 坐标被正确提取,但随后引发 IndexOutOfBoundsException。我认为会发生这种情况,因为未定义第 2 组。我认为首先我必须计算点数,然后迭代这个数字。在迭代内部,我将使用简单的 add() 将 int 值放入 ArrayList 中。但我不知道该怎么做。也许我现在不理解正则表达式部分。尤其是小组的工作方式。

请帮忙!

4

4 回答 4

4
String points = "{{-100,100},{-120,60},{-80,60},{-100,100},{-100,100}}";

String[] strs = points.replaceAll("(\\{|\\})", "").split(",");

ArrayList<Integer> list = new ArrayList<Integer>(strs.length);

for (String s : strs)
{
    list.add(Integer.valueOf(s));
}
于 2013-06-18T11:18:08.470 回答
4

您似乎不了解正则表达式 API 的部分是每次调用find(). 或者,换一种说法:捕获组的编号是它在模式中的位置,而不是在输入字符串中。

你也在以错误的方式解决这个问题。您应该匹配您正在寻找的整个构造,在这种情况下是{x,y}对。我假设你不想验证整个字符串的格式,所以我们可以忽略外面的括号和逗号:

Pattern p = Pattern.compile("\\{(-?\\d+),(-?\\d+)\\}");
Matcher m = p.matcher(name);

while (m.find()) {
    String x = m.group(1);
    String y = m.group(2);
    // parse and add to list
}

或者,由于您不关心哪个坐标是 X 哪个是 Y,您甚至可以这样做:

Matcher m = Pattern.compile("-?\\d+").matcher(name);
while (m.find()) {
    String xOrY = m.group();
    // parse etc.
}

现在,如果您也想验证输入,我会说这是一个单独的问题,我不一定会尝试在与解析相同的步骤中执行此操作以保持正则表达式的可读性。(在这种情况下可能是可能的,但是如果您不需要它,为什么要首先打扰。)

于 2013-06-18T11:07:48.813 回答
0

你也可以试试这个正则表达式:

((-?\d+)\s*,\s*(-?\d+))

它将为您提供三组:

Group 1 : x
Group 2 : y
Group 3 : x,y

您可以使用您需要的那个。

于 2013-06-18T11:22:52.727 回答
0

只用一行来做这件事怎么样:

List<String> list = Arrays.asList(name.replaceAll("(^\\w+=\\{+)|(\\}+$)", "").split("\\{?,\\}?"));

您的整个方法将是:

private ArrayList<Integer> getPolygonPoints(String name) {
    return new ArrayList<String>(Arrays.asList(name.replaceAll("(^\\w+=\\{+)|(\\}+$)", "").split("\\{?,\\}?")));
}

这首先去除前导和尾随文本,然后在逗号上拆分,可选地用大括号括起来。

顺便说一句,您真的应该返回抽象类型List,而不是具体实现ArrayList

于 2013-06-18T11:07:19.770 回答