我有点卡在正则表达式上。请考虑以下代码:
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
我无法使常规模式生效。有人有想法吗?
答案 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
继续上一场比赛结束的比赛
(?=
是一个积极的先行者,以确保模式的结尾符合预期(例如,字符串的结尾或下一个[
)。