1

我需要一个可以匹配这样的正则表达式:

1234 <CIRCLE> 12 12 12 </CIRCLE>

1234 <RECTANGLE> 12 12 12 12 </RECTANGLE>

我来写这个正则表达式:

(\\d+?) <([A-Z]+?)> (\\d+?) (\\d+?) (\\d+?) (\\d*)? (</[A-Z]+?>)

当我尝试匹配矩形时它工作正常,但它不适用于圆形

问题是我的第五组没有捕捉到,虽然它应该是?

4

5 回答 5

1

尝试

(\\d+?) <([A-Z]+?)> (\\d+?) (\\d+?) (\\d+?) (\\d+ )?(</[A-Z]+?>)

(我更改了最后一个“\d”组以使空格也是可选的。)

于 2014-09-23T21:45:16.773 回答
0

那是因为只有(\\d*)?部分是可选的,但它之前和之后的空格是强制性的,所以你最终需要两个空格,如果最后(\\d*)找不到的话。尝试使用类似的东西

(\\d+?) <([A-Z]+?)> (:?(\\d+?) ){3,4}(</[A-Z]+?>)

哦,如果你想确保结束标签与开始标签相同,你可以使用组引用,比如\\1表示来自第一组的匹配。所以也许将您的正则表达式更新为类似

(\\d+?) <([A-Z]+?)> (:?(\\d+?) ){3,4}(</\\2>)
//        ^^^^^^^-----------------------^^^ 
//        group 2                       here value need to match one from group 2
于 2014-09-23T21:46:03.260 回答
0

仅针对数字的解决方案:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Nonnull;

public class Q26005150
{
    private static final Pattern P = Pattern.compile("(\\d+)");

    public static void main(String[] args)
    {
        final String s1 = "1234 <CIRCLE> 12 12 12 </CIRCLE>";
        final String s2 = "1234 <RECTANGLE> 12 12 12 12 </RECTANGLE>";

        final List<Integer> l1 = getAllMatches(s1);
        final List<Integer> l2 = getAllMatches(s2);

        System.out.println("l1 = " + l1);
        System.out.println("l2 = " + l2);
    }

    private static List<Integer> getAllMatches(@Nonnull final String s)
    {
        final Matcher m = P.matcher(s);
        final List<Integer> matches = new ArrayList<Integer>();
        while(m.find())
        {
            matches.add(Integer.valueOf(m.group(1)));
        }
        return matches;
    }
}

输出:

l1 = [1234, 12, 12, 12]
l2 = [1234, 12, 12, 12, 12]

在 GitHub 上回答

Stackoverflow GitHub 存储库

于 2014-09-23T22:45:00.150 回答
0

数字和标签的解决方案

private static final Pattern P = Pattern.compile("(<\/?(\w+)>|(\d+))");

public static void main(String[] args)
{
    final String s1 = "1234 <CIRCLE> 12 12 12 </CIRCLE>";
    final String s2 = "1234 <RECTANGLE> 12 12 12 12 </RECTANGLE>";

    final List<String> l1 = getAllMatches(s1);
    final List<String> l2 = getAllMatches(s2);

    System.out.println("l1 = " + l1);
    System.out.println("l2 = " + l2);
}

private static List<String> getAllMatches(@Nonnull final String s)
{
    final Matcher m = P.matcher(s);
    final List<String> matches = new ArrayList<String>();
    while(m.find())
    {
        final String match = m.group(1);
        matches.add(match);
    }
    return matches;
}

输出:

l1 = [1234, <CIRCLE>, 12, 12, 12, </CIRCLE>]
l2 = [1234, <RECTANGLE>, 12, 12, 12, 12, </RECTANGLE>]

在 GitHub 上回答

Stackoverflow GitHub 存储库

于 2014-09-23T22:54:34.783 回答
-1

假设“<”和“>”之间的标签必须匹配并且它们之间的数字相同,请
使用此模式

^\d+\s<([A-Z]+)>\s(\d+\s)(\2)+<\/(\1)>$  

演示

或者如果中间的数字不必相同和/或可选:

^\d+\s<([A-Z]+)>\s(\d+\s)*<\/(\1)>$
于 2014-09-23T21:56:25.783 回答