RegEx读取未知多重性的多个参数

时间:2011-05-26 13:01:27

标签: java regex

我有点卡在正则表达式上。请考虑以下代码:

    String regFlagMulti = "^(\\[([\\w=]*?)\\])*?$";
    String flagMulti = "[TestFlag=1000][TestFlagSecond=1000]";
    Matcher mFlagMulti = Pattern.compile(regFlagMulti).matcher(flagMulti);

    if(mFlagMulti.matches()){
        for(int i = 0; i <= mFlagMulti.groupCount(); i++){
            System.out.println(mFlagMulti.group(i));
        }
    }else{
        System.out.println("MultiFlag didn't match!");
    }

我想要的是一个常规模式,它为我提供了 [] 中的文字;结果匹配对象的一组中的每一个。

重要提示:我不知道输入字符串中有多少[]个表达式!

对于上面的代码,它输出:

[TestFlag=1000][TestFlagSecond=1000]
[TestFlagSecond=1000]
TestFlagSecond=1000

我无法使常规模式生效。有人有想法吗?

4 个答案:

答案 0 :(得分:3)

使用匹配字符串中单个项目的模式,并使用Matcher.find()迭代整个字符串。

答案 1 :(得分:3)

  

我想要的是一个常规模式,它为我提供了[]内的文字;结果匹配对象的一组中的每一个。

不幸的是,使用Java正则表达式引擎无法做到这一点。在这里查看我的(类似)问题:


这个小组:

(\\[([\\w=]*?)\\])*
\________________/

是第1组,并且始终包含该组的最后一场比赛


这是一个解决方案的建议,它也提取了键/值:

String regFlagMulti = "(\\[(\\w*?)=(.*?)\\])";
String flagMulti = "[TestFlag=1000][TestFlagSecond=1000]";
Matcher mFlagMulti = Pattern.compile(regFlagMulti).matcher(flagMulti);

while (mFlagMulti.find()) {
    System.out.println("String: " + mFlagMulti.group(1));
    System.out.println("   key: " + mFlagMulti.group(2));
    System.out.println("   val: " + mFlagMulti.group(3));
    System.out.println();
}

<强>输出:

String: [TestFlag=1000]
   key: TestFlag
   val: 1000

String: [TestFlagSecond=1000]
   key: TestFlagSecond
   val: 1000

答案 2 :(得分:3)

您可以尝试以下操作:

String regFlagMulti = "\\[(\\w+=.*?)\\]";
String flagMulti = "[TestFlag=1000][TestFlagSecond=1000]";
Matcher mFlagMulti = Pattern.compile(regFlagMulti).matcher(flagMulti);
while(mFlagMulti.find()){
    System.out.println(mFlagMulti.group(1));
}

<强>输出:

TestFlag=1000
TestFlagSecond=1000

答案 3 :(得分:0)

正如Aaron正确指出的那样,使用一个组(它们对模式是静态的,重复不作为附加组添加)并调用find

使用的模式可能如下:\G\[([^\]]*)\](?=\[|$)

然后,第1组将包含[]内的文字。

注意:

\G继续上一场比赛结束的比赛

(?=是一个积极的先行者,以确保模式的结尾符合预期(例如,字符串的结尾或下一个[)。