Как сопоставить текст в круглых скобках с помощью regex?

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

(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));
}

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

Ответ 1

Pattern p = Pattern.compile("\\((.*?)\\)",Pattern.DOTALL);

Ответ 2

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

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

Запрос: это "КОМПАНИЯ", "ASP" и "INC". требуется?

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

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

Ответ 3

Протестировано с помощью Java 8: /** * Ниже шаблон возвращает строку в круглой скобке.

* 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*\\)+");

Ответ 4

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

Ответ 5

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

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

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