java - 使用正则表达式分割字符串,但在子字符串中包含部分正则表达式

标签 java arrays regex string

我有一个像这样的字符串:

"tag0 tag1 yellow\ green tag2"

我想在每个未转义的空格之后分割它,所以我得到这个结果:

result[0] = "tag0"
result[1] = "tag1"
result[2] = "yellow\ green"
result[3] = "tag2"

有什么功能可以帮我做到这一点吗? string.split()使用正则表达式 "[^\\] " 也会删除最后一个字符,这是我想避免的。这是我通过 string.split 和 "[^\\] " 得到的结果:

result[0] = "tag"
result[1] = "tag"
result[2] = "yellow\ gree"
result[3] = "tag2"

最佳答案

使用负向后查找可能是一种解决方法,但它不能保证前面的反斜杠本身不是转义的反斜杠。例如:

tag0 tag1 yellow\\ green tag2

如果您可以避免拆分,而是在正则表达式下面进行匹配将匹配预期的 block :

[^\s\\]+(?:\\.[^\s\\]*)*

Live demo

分割:

  • [^\s\\]+ 匹配除空格和反斜杠之外的任何内容
  • (?: 启动非 capturin 组
    • \\. 匹配转义字符
    • [^\s\\]* 匹配除空格和反斜杠之外的任何内容
  • )* NCG 结束,尽可能重复多次

Java:

String regex = "[^\\s\\\\]+(?:\\\\.[^\\s\\\\]*)*";
String string = "tag0 tag1 yellow\\ green tag2";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

Java demo

关于java - 使用正则表达式分割字符串,但在子字符串中包含部分正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49387859/

相关文章:

java - 在 Java 中,我应该为常量属性使用 getter 还是接口(interface)标记?

Java仅调用以parent作为函数参数的方法

java - 如何从 Intellij IDEA 取消隐藏类?

java - 如何找到数组中变化最大的差异? - java

java - 从另一个类创建对象数组

r - 如何在 R 中使用正则表达式匹配并包含条件?

javascript - 如何检查字符串是否在不同位置包含多个单词

java - springMVC : view won't submit values to controller

PHP 数组引用混淆

javascript - 用于删除包含指定集中*不*字符的单词的正则表达式