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

#java #regex

#java #регулярное выражение

Вопрос:

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

Я пробовал ниже, но оно всегда возвращает 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
  

Комментарии:

1. пожалуйста, обновите свой требуемый вывод

Ответ №1:

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

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

В Java:

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

Объяснение

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

Демонстрация регулярного выражения | Демонстрация 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
  

Ответ №2:

Я бы посоветовал вам достичь этого в двухэтапном процессе:

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

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

ДЕМОНСТРАЦИЯ

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

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

Ответ №3:

Увидев это, вы можете получить представление

([w] ),([w] ),([w] )

ДЕМОНСТРАЦИЯ: https://rubular.com/r/9HDIwBTacxTy2O