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=]*?)
,也许([^\\]*)
也可以。