尝试通过正则表达式匹配字符串中可能的标签

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] 匹配逗号或水平空白字符。

Regex demo | Java demo

示例代码

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+)*)"

Regex demo