1

我想使用 Pattern 和 Matcher 将以下字符串作为多个变量返回。

    ArrayList <Pattern> pArray = new ArrayList <Pattern>();
    pArray.add(Pattern.compile("\\[[0-9]{2}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}\\]"));
    pArray.add(Pattern.compile("\\[\\d{1,5}\\]"));
    pArray.add(Pattern.compile("\\[[a-zA-Z[^#0-9]]+\\]"));
    pArray.add(Pattern.compile("\\[#.+\\]"));
    pArray.add(Pattern.compile("\\[[0-9]{10}\\]"));
    Matcher iMatcher;
    String infoString = "[03/12/13 10:00][30][John Smith][5554215445][#Comment]";
    for (int i = 0 ; i < pArray.size() ; i++)
    {
        //out.println(pArray.get(i).toString());
        iMatcher = pArray.get(i).matcher(infoString);

        while (dateMatcher.find())
        {
                String found = iMatcher.group();
                out.println(found.substring(1, found.length()-1));
        }
    }
}

程序输出:

[03/12/13 10:00]

[30]

[John Smith]

[\#Comment]

[5554215445]

我唯一需要的是让程序不打印括号和 # 字符。我可以很容易地避免在循环内使用子字符串打印括号,但我无法避免 # 字符。# 只是字符串中的注释标识符。

这可以在循环内完成吗?

4

2 回答 2

2

这个怎么样?

public static void main(String[] args) {
    String infoString = "[03/12/13 10:00][30][John Smith][5554215445][#Comment]";
    final Pattern pattern = Pattern.compile("\\[#?(.+?)\\]");
    final Matcher matcher = pattern.matcher(infoString);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }
}

您只需要使.+非贪婪,它将匹配方括号之间的所有内容。然后,我们使用匹配组来获取我们想要的内容,而不是使用整个匹配模式,匹配组由 表示(pattern)。匹配匹配组之前的#?哈希,这样它就不会进入组。

使用 检索匹配组matcher.group(1)

输出:

03/12/13 10:00
30
John Smith
5554215445
Comment
于 2013-03-13T10:42:28.580 回答
2

使用前瞻。即用积极的后视改变你所有的\\[(在你的正则表达式中):

(?<=\\[)

然后\\]用积极的前瞻来改变你所有的(在你的正则表达式中):

(?=\\])

最终改变\\[#(在你的正则表达式中)积极的向后看:

(?<=\\[#)
于 2013-03-13T10:43:57.777 回答