如何解决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!\");
}
我想要的是一个常规模式,可以给我[]内的文本;生成的Matcher对象组中的每个对象。
重要:我不知道输入字符串中有多少[]个表达式!
对于上面的代码,它输出:
[TestFlag=1000][TestFlagSecond=1000]
[TestFlagSecond=1000]
TestFlagSecond=1000
我无法使用常规模式。有人知道吗?
解决方法
我想要的是一个常规模式,可以给我[]内的文本;生成的Matcher对象组中的每个对象。
不幸的是,Java regex引擎无法做到这一点。在这里查看我的(类似)问题:
组数可变的正则表达式?
这个小组:
(\\\\[([\\\\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
,使用与字符串中单个项目匹配的模式,并使用Matcher.find()
遍历整个String。
,您可以尝试以下方法:
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
,正如Aaron正确指出的那样,使用一组(它们对模式是静态的,重复不会作为其他组添加)并调用find
。
使用的模式可能是这样的:\\G\\[([^\\]]*)\\](?=\\[|$)
然后,第1组将在“ 10”内包含该文本。
笔记:
\\G
继续最后一场比赛结束的比赛
(?=
是肯定的超前形式,可确保模式的结尾与预期的一样(例如,字符串的结尾或下一个[
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。