Регулярное выражение для разделения между трубами, кроме скобок - PullRequest
0 голосов
/ 30 октября 2018

У меня есть следующая текстовая строка:

|random|[abc|www.abc.org]|1024|

Я бы хотел разделить их на 3 части с помощью регулярного выражения

random
[abc|www.abc.org]
1024

В настоящее время следующий результат достигается с помощью выражения \ |

random
[abc
www.abc.org]
1024

Моя проблема в том, что я не могу исключить символ трубы в среднем столбце, заключенный в квадратные скобки [].

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вы можете использовать следующий код:

final String regex = "(?<=|)\\[?[\\w.]+\\|?[\\w.]+\\]?(?=|)";
final String string = "|random|[abc|www.abc.org]|[test]|1024|";

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

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
}

Выход:

Full match: random
Full match: [abc|www.abc.org]
Full match: [test]
Full match: 1024

Смотрите здесь на regex101: https://regex101.com/r/Fcb3Wx/1

0 голосов
/ 30 октября 2018

Если вам нужно использовать split, вы можете использовать регулярное выражение

\|(?=$|[^]]+\||\[[^]]+\]\|)

https://regex101.com/r/7OxmiY/1

Это будет соответствовать трубе, а затем смотреть либо:

$, конец строки, так что окончательный | делится на, или

[^]]+\|, отличные от ] символов, пока не будет достигнута труба, гарантируя, что трубы внутри [] s не будут разбиты, или

\[[^]]+\]\| - То же, что и выше, за исключением буквальных [ и ] с, окружающих шаблон

В Java:

String input = "|random|[abc|www.abc.org]|[test]|1024|";
String[] output = input.split("\\|(?=$|[^]]+\\|)"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...