正则表达式。如何在一些文字后找到类似的部分

时间:2013-12-04 15:03:06

标签: java regex

我有字符串p[name]=[1111];[2222],我需要从中获取3部分 p[name]= [1111] { {1}} 即可。字符串可以是不同的,例如[2222]p[name]=[1111] 我正在尝试使用正则表达式,但找不到合适的解决方案 我的正则表达式是

p[name]=[1111];[2222,[1,2,3],1];[3333]

当我运行此代码时,我只有两个组

(p\\[[a-zA-Z0-9]+\\]=)(?:(\\[.[^;]+\\]);?)+   

结果是

Pattern p = Pattern.compile("(p\\[[a-zA-Z0-9^=]+\\]=)(?:;*(\\[.[^;]+\\]))+");
Matcher m = p.matcher("p[name]=[1111];[2222]");
if (m.find()) {
    for(int i = 1, l = m.groupCount(); i <= l; ++i) {
        System.out.println(m.group(i));
    }   
} 

2 个答案:

答案 0 :(得分:3)

为什么不简单地这样做?

Pattern p = Pattern.compile("p\\[[a-z0-9]+]=|\\[[0-9]+]", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("p[name]=[1111];[2222]");
while(m.find()) {
    System.out.println(m.group());
}

但是,如果要同时检查字符串结构,可以使用这种模式:

Pattern p = Pattern.compile("(p\\[[a-z0-9]+]=)|\\G(?<!^)(\\[[0-9]+])(?:;|$)", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("p[name]=[1111];[2222]");
while(m.find()) {
    System.out.println((m.group(1))? m.group(1) : m.group(2));
} 

答案 1 :(得分:0)

我可以给你这个正则表达式。这应该也适用于:p [name] = [1111]; [2222,[1,2,3],1]

Pattern p = Pattern.compile("([p]+)|\[[a-z0-9\,\[\]]+\]");
Matcher m = p.matcher("p[name]=[1111];[2222]");
if (m.find()) {
    for(int i = 1, l = m.groupCount(); i <= l; ++i) {
        System.out.println(m.group(i));
    }   
}