首页 > 解决方案 > 除非在特定情况下,否则如何匹配单个字符

问题描述

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

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

例子:

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(德摩根法则)之后,我确实制作了一个正则表达式来匹配“;” 括号外。

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

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

标签: javaregexstringregex-lookaroundsstring-matching

解决方案


我确信一些 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;

如果您想简化/修改/探索表达式,它已在regex101.com的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。



推荐阅读