尝试通过正则表达式匹配字符串中可能的标签
Trying to match possible tags in string by regex
这些是我可能的输入:
"@smoke"
"@smoke,@Functional1" (OR condition)
"@smoke,@Functional1,@Functional2" (OR condition)
"@smoke","@Functional1" (AND condition),
"@smoke","~@Functional1" (SKIP condition),
"~@smoke","~@Functional1" (NOT condition)
(请注意,正则表达式的字符串输入在每行的最后一个 "
字符处停止,后面没有 space 或逗号!
到目前为止我想出的正则表达式是
"((?:[~@]{1}\w*)+),?"
这与样本 1、4、5 和 6 的捕获组匹配,但不匹配 2 和 3。
我不确定如何继续进一步调整它,有什么建议吗?
我也想捕获标签的前面的布尔含义(例如:〜)。
如果您有任何建议在正则表达式之前预处理 Java 中的字符串以使其更简单,我也愿意接受这种可能性。
谢谢。
您似乎想要匹配一个可选的 ~
后跟一个 @
并为第 1 组进行迭代匹配。您可以使用 \G
锚点,它匹配在上一场比赛开始或结束时。
(?:"(?=.*"$)|\G(?!^))(~?@\w+(?:,~?@\w+)*)"?[,\h]?
说明
(?:
非捕获组
"(?=.*"$)
匹配 "
并断言字符串以 "
结尾
|
或
\G(?!^)
声明上一场比赛结束时的位置,而不是开始
)
关闭非捕获组
(
捕获 组 1
~?@\w+(?:,~?@\w+)*
匹配一个可选的 ~
,而不是 @
和 1+ 个单词字符并重复 0+ 次,并在前面加上逗号
)"?
关闭第 1 组并匹配一个可选的 "
[,\h]
匹配逗号或水平空白字符。
示例代码
String regex = "(?:\"(?=.*\"$)|\G(?!^))(~?@\w+(?:,~?@\w+)*)\"?[,\h]?";
String string = "\"@smoke\"\n"
+ "\"@smoke,@Functional1\"\n"
+ "\"@smoke,@Functional1,@Functional2\"\n"
+ "\"@smoke\",\"@Functional1\"\n"
+ "\"@smoke\",\"~@Functional1\"\n"
+ "\"~@smoke\",\"~@Functional1\"";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
输出
@smoke
@smoke,@Functional1
@smoke,@Functional1,@Functional2
@smoke
@Functional1
@smoke
~@Functional1
~@smoke
~@Functional1
编辑
如果没有连续匹配,也可以使用:
"(~?@\w+(?:,~?@\w+)*)"
这些是我可能的输入:
"@smoke"
"@smoke,@Functional1" (OR condition)
"@smoke,@Functional1,@Functional2" (OR condition)
"@smoke","@Functional1" (AND condition),
"@smoke","~@Functional1" (SKIP condition),
"~@smoke","~@Functional1" (NOT condition)
(请注意,正则表达式的字符串输入在每行的最后一个 "
字符处停止,后面没有 space 或逗号!
到目前为止我想出的正则表达式是
"((?:[~@]{1}\w*)+),?"
这与样本 1、4、5 和 6 的捕获组匹配,但不匹配 2 和 3。
我不确定如何继续进一步调整它,有什么建议吗? 我也想捕获标签的前面的布尔含义(例如:〜)。 如果您有任何建议在正则表达式之前预处理 Java 中的字符串以使其更简单,我也愿意接受这种可能性。
谢谢。
您似乎想要匹配一个可选的 ~
后跟一个 @
并为第 1 组进行迭代匹配。您可以使用 \G
锚点,它匹配在上一场比赛开始或结束时。
(?:"(?=.*"$)|\G(?!^))(~?@\w+(?:,~?@\w+)*)"?[,\h]?
说明
(?:
非捕获组"(?=.*"$)
匹配"
并断言字符串以"
结尾
|
或\G(?!^)
声明上一场比赛结束时的位置,而不是开始
)
关闭非捕获组(
捕获 组 1~?@\w+(?:,~?@\w+)*
匹配一个可选的~
,而不是@
和 1+ 个单词字符并重复 0+ 次,并在前面加上逗号
)"?
关闭第 1 组并匹配一个可选的"
[,\h]
匹配逗号或水平空白字符。
示例代码
String regex = "(?:\"(?=.*\"$)|\G(?!^))(~?@\w+(?:,~?@\w+)*)\"?[,\h]?";
String string = "\"@smoke\"\n"
+ "\"@smoke,@Functional1\"\n"
+ "\"@smoke,@Functional1,@Functional2\"\n"
+ "\"@smoke\",\"@Functional1\"\n"
+ "\"@smoke\",\"~@Functional1\"\n"
+ "\"~@smoke\",\"~@Functional1\"";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
输出
@smoke
@smoke,@Functional1
@smoke,@Functional1,@Functional2
@smoke
@Functional1
@smoke
~@Functional1
~@smoke
~@Functional1
编辑
如果没有连续匹配,也可以使用:
"(~?@\w+(?:,~?@\w+)*)"