我需要RegEX帮助...基本上是一个匹配以下字符串的模式
G1:k6YxekrAP71LqRv[P:3]
G1:k6YxekrAP71LqRv[S:2,3,4|P:3]
G1:k6YxekrAP71LqRv[P:3|R:2,3,4,5]
G1:k6YxekrAP71LqRv[S:2,3,4|P:3|R:2,3,4,5]
“G1:k6YxekrAP71LqRv”和“P:3”是最匹配的东西
我已经完成了以下匹配第一个字符串,但其余的都丢失了。
G1:k6YxekrAP71LqRv(\[|\|)P:3(\||\])
如果我没有弄错的话,所有字符串都以G1:k6YxekrAP71LqRv
开头。
在那之后,有[P:3]
本身,或左S:2,3,4|
,右|R:2,3,4,5
或左右两侧。值2,3,4和2,3,4,5可以是重复数字除以逗号。
要匹配您可以使用的完整模式:
(G1:k6YxekrAP71LqRv)\[(?:S:(?:\d,)+\d\|)?(P:3)(?:\|R:(?:\d,)+\d)?\]
说明
(G1:k6YxekrAP71LqRv) # Match literally in group 1 \[ # Match [ (?: # Non capturing group S: # Match literally (?:\d,)+\d\| # Match repeatedly a digit and comma one or more times \d\| # Followed by a digit and | )? # Close group and make it optional (P:3) # Capture P:3 in group 2 (?: # Non capturing group \|R: # match |R: (?:\d,)+ # Match repeatedly a digit and comma one or more times \d # Followed by a digit )? # Close group and make it optional \] # Match ]
而对于(?:\d,)+\d
你也可以使用2,3,4
和2,3,4,5
fi你想要匹配那些字面意思。
要将整个字符串与G1:k6YxekrAP71LqRv在开头匹配并且应该包含P:3
,您可以使用正向前瞻(?=.*P:3)
:
"((G1:k6YxekrAP71LqRv)\\[.*(?<=\\||\\[)P:3(?=\\]|\\,|\\|)[^\\]]*\\])"
\\
- 这在正则表达式中用于转义在正则表达式中具有特殊含义的字符
G1:k6YxekrAP71LqRv
这些字符需要按字面匹配(在括号中匹配组#1(“()
”))
\\[.*
- [
字符及其后的任何字符零次或多次
(?<=\\||\\[)P:3
- 积极的lookbehind - 在这里你说,你想要P:3
先于|
或[
和
P:3(?=\\]|\\,|\\|)
- 积极的向前看 - P:3
只能跟随]
或,
或|
(如果你不想匹配例如:P:3,4
,只需从正则表达式中删除以下部分:|\\,
(P:3
) - 捕获组#2
[^\\]]*
- 除了]
之外,还可能出现零个或多个字符
\\]
- 比赛结束时的]
角色
String s1 = "G1:k6YxekrAP71LqRv[P:3]";
String s2 = "G1:k6YxekrAP71LqRv[S:2,3,4|P:3]";
String s3 = "G1:k6YxekrAP71LqRv[P:3|R:2,3,4,5]";
String s4 = "G1:k6YxekrAP71LqRv[S:2,3,4|P:3|R:2,3,4,5]";
String withCommaAfter = "G1:k6YxekrAP71LqRv[S:2,3,4|P:3,4]";
String notMatch1 ="G1:k6YxekrAP71LqRv[P:33]";
String notMatch2 = "G1:k6YxekrAP71LqRv[S:2,3,4|P:33]";
String[] sampleStrings = new String[] {s1, s2, s3, s4, withCommaAfter, notMatch1, notMatch2}; // to store source strings and to print results in a loop
Pattern p = Pattern.compile("(G1:k6YxekrAP71LqRv)\\[.*(?<=\\||\\[)(P:3)(?=\\]|\\,|\\|)[^\\]]*\\]");
for(String s : sampleStrings) {
System.out.println("Checked String: \"" + s + "\"");
Matcher m = p.matcher(s);
while(m.find()) { // if match is found print the following line to the console
System.out.println("\t whole String : " + m.group());
System.out.println("\t G1...qRv part : " + m.group(1));
System.out.println("\t P:3 part : " + m.group(2) + "\n");
}
}
如果你想要匹配String withCommaAfter
你得到的输出(如果你不想匹配它,从正则表达式中删除|\\,
:
Checked String: "G1:k6YxekrAP71LqRv[P:3]"
whole String : G1:k6YxekrAP71LqRv[P:3]
G1...qRv part : G1:k6YxekrAP71LqRv
P:3 part : P:3
Checked String: "G1:k6YxekrAP71LqRv[S:2,3,4|P:3]"
whole String : G1:k6YxekrAP71LqRv[S:2,3,4|P:3]
G1...qRv part : G1:k6YxekrAP71LqRv
P:3 part : P:3
Checked String: "G1:k6YxekrAP71LqRv[P:3|R:2,3,4,5]"
whole String : G1:k6YxekrAP71LqRv[P:3|R:2,3,4,5]
G1...qRv part : G1:k6YxekrAP71LqRv
P:3 part : P:3
Checked String: "G1:k6YxekrAP71LqRv[S:2,3,4|P:3|R:2,3,4,5]"
whole String : G1:k6YxekrAP71LqRv[S:2,3,4|P:3|R:2,3,4,5]
G1...qRv part : G1:k6YxekrAP71LqRv
P:3 part : P:3
Checked String: "G1:k6YxekrAP71LqRv[S:2,3,4|P:3,4]"
whole String : G1:k6YxekrAP71LqRv[S:2,3,4|P:3,4]
G1...qRv part : G1:k6YxekrAP71LqRv
P:3 part : P:3
Checked String: "G1:k6YxekrAP71LqRv[P:33]"
Checked String: "G1:k6YxekrAP71LqRv[S:2,3,4|P:33]"