Как мне сопоставить текст в скобках с помощью регулярных выражений? - PullRequest
10 голосов
/ 27 августа 2009

У меня есть следующий шаблон:

(COMPANY) -277.9887 (ASP,) -277.9887 (INC.) 

Я хочу, чтобы конечный результат был:

КОМПАНИЯ ASP, INC.

В настоящее время у меня есть следующий код, и он продолжает возвращать исходный шаблон (я полагаю, потому что вся группа находится между первым '(' и последним ')'

Pattern p = Pattern.compile("((.*))",Pattern.DOTALL);
Matcher matcher = p.matcher(eName);
while(matcher.find())
{
    System.out.println("found match:"+matcher.group(1));
}

Я изо всех сил пытаюсь получить нужные мне результаты и ценю любую помощь. Меня не волнует объединение результатов после того, как я получу каждую группу, просто нужно получить каждую группу.

Ответы [ 5 ]

28 голосов
/ 27 августа 2009
Pattern p = Pattern.compile("\\((.*?)\\)",Pattern.DOTALL);
6 голосов
/ 27 августа 2009

Ваш. * Квантификатор «жадный», так что да, он захватывает все между первой и последней доступной скобкой. Как говорит хаос, кратко :), используя. *? является не жадным квантификатором, поэтому он будет захватывать как можно меньше при сохранении соответствия.

И вам нужно избегать скобок в регулярном выражении, в противном случае он становится другой группой. Это при условии, что в вашей строке есть буквальные скобки. Я подозреваю, что то, на что вы ссылались в первоначальном вопросе, поскольку ваша модель на самом деле является вашей строкой.

Запрос: "КОМПАНИЯ", "ASP" и "INC." обязательны для заполнения

Если вы должны иметь значения для них, тогда вы хотите использовать + вместо *, + равен 1 или более, * равен нулю или более, поэтому * будет соответствовать буквенной строке "() «

Например: "((. +?))"

1 голос
/ 29 мая 2017

Протестировано с Java 8: / ** * Ниже Pattern возвращает строку в скобках.

* Description about casting regular expression: \(+\s*([^\s)]+)\s*\)+

* \(+ : Exactly matches character "(" at least once
* \s* : matches zero to any number white character.
* ( : Start of Capturing group
* [^\s)]+: match any number of character except ^, ) and spaces.
* ) : Closing of capturing group.
* \s*: matches any white character(0 to any number of character)
* \)*: Exactly matches character ")" at least once.


private static Pattern REGULAR_EXPRESSION = Pattern.compile("\\(+\\s*([^\\s)]+)\\s*\\)+");
0 голосов
/ 27 августа 2009

Если ваши строки всегда будут выглядеть так, вы можете просто использовать пару вызовов вместо replaceAll. Кажется, это работает для меня:

String eName = "(COMPANY) -277.9887 (ASP,) -277.9887 (INC.)";
        String eNameEdited = eName.replaceAll("\\).*?\\("," ").replaceAll("\\(|\\)","");
        System.out.println(eNameEdited);

Вероятно, не самая эффективная вещь в мире, но довольно простая.

0 голосов
/ 27 августа 2009

Не прямой ответ на ваш вопрос, но я рекомендую вам использовать RegxTester , чтобы быстро найти ответ и любой будущий вопрос. Это позволяет вам тестировать в режиме реального времени.

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