Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于读取多个未知多重性参数的正则表达式_Java_Regex - Fatal编程技术网

Java 用于读取多个未知多重性参数的正则表达式

Java 用于读取多个未知多重性参数的正则表达式,java,regex,Java,Regex,我对正则表达式有点迷恋。考虑下面的代码: String regFlagMulti = "^(\\[([\\w=]*?)\\])*?$"; String flagMulti = "[TestFlag=1000][TestFlagSecond=1000]"; Matcher mFlagMulti = Pattern.compile(regFlagMulti).matcher(flagMulti); if(mFlagMulti.matches()){

我对正则表达式有点迷恋。考虑下面的代码:

    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!");
    }

我无法让常规模式发挥作用。有人有想法吗?

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

我想要的是一个规则的模式,它可以给我[]中的文本;结果匹配器对象组中的每个对象。

不幸的是,这不能用Java正则表达式引擎来完成。请看我的(类似)问题:


这一组:

(\\[([\\w=]*?)\\])*
\________________/
是组号1,将始终包含该组的最后一个匹配项


下面是一个解决方案的建议,该解决方案还可以获取密钥/VAL:

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
TestFlag=1000
TestFlagSecond=1000

您可以尝试以下操作:

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));
}
输出:

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

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

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

要使用的模式可以是这样的:
\G\[([^\]*)\](?=\[\$)

然后,组1将包含
[]
中的文本

注:

\G
继续上次匹配结束的匹配


(?=
是一个积极的前瞻,以确保模式的结尾如预期的那样(例如,字符串的结尾或下一个
[
)。

这不是重点,而是代替
([\\w=]*?)
,也许
([^\\]*)
也可以。