Как сопоставить один символ, кроме случаев, когда в конкретной ситуации - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть строка, которую я хочу разбить на части в каждой точке с запятой ;.

Для этого я использую 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 (закон Моргана) я сделал регулярное выражение для соответствия ";"вне скобок.

Но это все еще не работает и все еще ломается в каждой точке с запятой ... это что-то с самой Java?

Текущий шаблон: ((?<![\S\s]*?\([\S\s]*?)|(?![\S\s]*?\)[\S\s]*?));

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Используйте это:

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

Код ниже:

import java.util.Arrays;

открытый класс Test {

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;]

0 голосов
/ 26 сентября 2019

Я уверен, что некоторые профессионалы 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 .Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


...