регулярное выражение найти строку между 2 символами, разделенными запятой - PullRequest
0 голосов
/ 02 апреля 2019

Я новичок в регулярном выражении и хочу найти строку между двумя символами,

Я пробовал ниже, но всегда возвращает false. Могу я узнать, что с этим не так?

 public static void main(String[] args) {
    String input = "myFunction(hello ,world, test)";
    String patternString = "\\(([^]]+)\\)";

    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
 }

Введите:

myFunction(hello,world,test), где myFunction может быть любым символом. перед началом (могут быть любые символы.

Выход:

hello
world
test

Ответы [ 3 ]

2 голосов
/ 02 апреля 2019

Вы можете сопоставить, используя якорь \G, который устанавливает позицию в конце предыдущего совпадения и фиксирует ваши значения в группе:

(?:\bmyFunction\(|\G(?!^))([^,]+)(?:\h*,\h*)?(?=[^)]*\))

В Java:

String regex = "(?:\\bmyFunction\\(|\\G(?!^))([^,]+)(?:\\h*,\\h*)?(?=[^)]*\\))";

Объяснение

  • (?: Группа без захвата
    • \bmyFunction\( Граница слова, чтобы совпадение было частью большего слова, соответствуйте myFunction и открывающим скобкам (
    • | или
    • \G(?!^) Утверждение позиции в конце предыдущего матча, а не в начале строки
  • ) Закрыть группу без захвата
  • ([^,]+) Захват в группе, соответствующей 1+ раз, не запятая
  • (?:\h*,\h*)? Опционально соответствует запятой, окруженной 0+ горизонтальными пробелами
  • (?=[^)]*\)) Позитивный взгляд, утверждаем, что справа - закрывающая скобка )

Regex demo | Java демо

Например:

String patternString = "(?:\\bmyFunction\\(|\\G(?!^))([^,]+)(?:\\h*,\\h*)?(?=[^)]*\\))";
String input = "myFunction(hello ,world, test)";

Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

Результат

hello 
world
test
1 голос
/ 02 апреля 2019

Я бы посоветовал вам добиться этого в два этапа:

Шаг 1: Захватить все содержимое между ( и )

Используйте регулярное выражение: ^\S+\((.*)\)$

Демо

Первая и единственная группа захвата будет содержать требуемый текст.

Шаг 2: Разделить захваченную строку выше на ,, получая все параметры через запятую независимо.

0 голосов
/ 02 апреля 2019

Увидеть это вы можете получить идею

([\w]+),([\w]+),([\w]+)

DEMO : https://rubular.com/r/9HDIwBTacxTy2O

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...