java - 仅当所有字符串都被引用时才用于拆分的正则表达式

标签 java regex

只有当所有字符串都使用正则表达式引用时,是否有一种方法可以返回拆分的分隔符?

考虑到字符串应该用“-”分割。

使用 ((?<=")-(?="))它匹配 2 -可以使用以下示例: "abc"-"123"-"zxc" .

但是正则表达式匹配 2 -在以下样本中,何时不应检测到任何 - :

abc"-"123"-"zxc"

"abc"-"123"-"zxc

使用 -(?=([^"]*"[^"]*")*[^"]*$)它匹配 2 -以下示例没问题: "abc"-"123"-"zxc" .

它不匹配任何 -在以下示例中也可以:

"abc"-"123"-"zxc

"abc"-"123"-zxc"

但是正则表达式匹配 2 -在以下样本中,何时不应检测到任何 - :

abc"-"123"-"zxc"

abc-"123"-"zxc"

"abc"-"123"-zxc

如果字符串与 ^"[\da-z\-"]*"$ 匹配,我想应用 2 个正则表达式我会用 ((?<=")-(?=")) 应用拆分但我觉得有一种方法我还没有尝试过。

最佳答案

如果您想返回定界符周围的值,您可以结合使用捕获组和 \G anchor 。

\G("[^"]*")(?=(?:-"[^"]*")*$)(?:-|$)

解释

  • \G 断言位置在上一个匹配项的末尾或字符串的开头
  • ("[^"]*") 从一个双引号匹配到一个双引号
  • (?=(?:-"[^"]*")*$) 断言 -".." 的可选部分在右边直到结束字符串
  • (?:-|$) 匹配 - 或字符串结尾

查看 Regex demoJava demo

在带有双反斜杠的 Java 中:

String regex = "\\G(\"[^\"]*\")(?=(?:-\"[^\"]*\")*$)(?:-|$)";

例如

String strings[] = {
    "\"abc\"-\"123\"-\"zxc1\"",
    "\"abc\"-\"123\"-\"zxc2",
    "\"abc\"-\"123\"-zxc3\"",
    "abc\"-\"123\"-\"zxc4\"",
    "\"abc\"-\"123\"-\"zxc5",
    "abc\"-\"123\"-\"zxc6\"",
    "abc-\"123\"-\"zxc7\"",
    "\"abc\"-\"123\"-zxc8"
};
String regex = "\\G(\"[^\"]*\")(?=(?:-\"[^\"]*\")*$)(?:-|$)";
Pattern pattern = Pattern.compile(regex);
for (String s : strings) {
    Matcher matcher = pattern.matcher(s);

    while (matcher.find()) {
        for (int i = 1; i <= matcher.groupCount(); i++) {
            System.out.println(matcher.group(i));
        }
    }
}

输出

"abc"
"123"
"zxc1"

关于java - 仅当所有字符串都被引用时才用于拆分的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65446558/

相关文章:

java - 使用JsonReader读取动态json文件

java - apache.commons.lang3.DateUtils.setMonths 十二月

ios - 在 NSPredicate 中使用正则表达式执行 NSFetchRequest

Javascript 正则表达式以逗号分隔的字符串拆分单词

java - 如何检查对象中的所有非原始元素是否为空

Java在中心旋转图像

Java Swing应用程序->servlet的JSON信息,怎么做? http? socket ?

regex - 仅显示正常运行时间 [unix]

C++按分隔符拆分字符串并将分隔符保留在结果中

regex - 关闭贪婪在此正则表达式中不起作用