除非在特定情况下如何匹配单个字符

How to match a single character except when on a specific situation

我有一个字符串,我想在每个分号处拆分成多个部分 ;

我正在为此使用 JAVA String.split(regex),创建一个字符串数组。

示例:

string 1;
string 2;
string 3;
string 4 (
   substring 1;
   substring 2;
   substring 3;
);
string 4;

我现在正在使用 line.split("\s*;\s*");...

但是,正如预期但不想要的那样,让我回来了 ["string 1", "string 2", "string 3", "string 4 (\nsubstring 1", "substring 2", "substring 3", ")", "string 4", ""]

那么我如何匹配每个 ; 以便我可以拆分它除了括号内的那些(子字符串之后的那些)?

编辑:

我确实设法创建了一个正则表达式来匹配“;”在括号内,但不在括号外......但是在使用逻辑并将 ~(a^b) 转换为 ~av~b (de morgan law)之后,我确实制作了一个正则表达式来匹配“;”括号外。

但它仍然不起作用,并且仍然在每个分号处中断...它与 Java 本身有关吗?

当前模式:((?<![\S\s]*?\([\S\s]*?)|(?![\S\s]*?\)[\S\s]*?));

我相信一些 Java 专业人士有比正则表达式更好的解决方案,但这可能有点接近研究:

.*\((?:\s*(?:[^\r\n]*;)\s*)+\);|[^\r\n]+

我猜你可能想要 trim 并将其推送到数组。

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = ".*\((?:\s*(?:[^\r\n]*;)\s*)+\);|[^\r\n]+";
        final String string = "string 1;\n"
             + "string 2;\n"
             + "string 3;\n"
             + "string 4 (\n"
             + "   substring 1;\n"
             + "   substring 2;\n"
             + "   substring 3;\n"
             + ");\n"
             + "string 4;\n"
             + "string 1;\n"
             + "string 2;\n"
             + "string 3;\n"
             + "string 4 (\n"
             + "   substring 1;\n"
             + "   substring 2;\n"
             + "   substring 3;\n"
             + ");\n"
             + "string 4;";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final 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));
            }
        }

    }
}

输出

Full match: string 1;
Full match: string 2;
Full match: string 3;
Full match: string 4 (
   substring 1;
   substring 2;
   substring 3;
);
Full match: string 4;
Full match: string 1;
Full match: string 2;
Full match: string 3;
Full match: string 4 (
   substring 1;
   substring 2;
   substring 3;
);
Full match: string 4;

如果您希望 simplify/modify/explore 表达式,regex101.com. If you'd like, you can also watch in this link 的右上面板已对其进行说明,它将如何匹配一些示例输入。


使用这个:

String[] array = line.split("(?<\!\(.*[^)]);");

代码如下:

导入java.util.Arrays;

public class 测试 {

public static void main(String[] args) {
    String line = "string 1;" + 
            "string 2;" + 
            "string 3;" + 
            "string 4 (" + 
            "   substring 1;" + 
            "   substring 2;" + 
            "   substring 3;" + 
            ");" + 
            "string 4;";
    System.out.println(line);   
    System.out.println();


    String[] array = line.split("(?<!\(.*[^)]);");
    System.out.println(
            Arrays.toString(array)); // Arrays.toString(Object[] a) converts an array to a printable string.


}

}

打印:

字符串 1;字符串 2;字符串 3;字符串 4(子字符串 1;子字符串 2;子字符串 3;);字符串 4;

[字符串 1,字符串 2,字符串 3,字符串 4(子字符串 1;子字符串 2;子字符串 3;),字符串 4;]