Ответ 1
Pattern p = Pattern.compile("\\((.*?)\\)",Pattern.DOTALL);
У меня есть следующий шаблон:
(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));
}
Я изо всех сил пытаюсь получить нужные мне результаты и ценю любую помощь. Я не беспокоюсь о конкатенации результатов после того, как я получу каждую группу, просто нужно получить каждую группу.
Pattern p = Pattern.compile("\\((.*?)\\)",Pattern.DOTALL);
Ваш. * квантификатор является "жадным", так что да, он захватывает все между первой и последней доступной скобкой. Как хаос говорит, кратко:), используя. *? является не-жадным квантором, поэтому он будет как можно меньше хватать, сохраняя при этом совпадение.
И вам нужно избежать скобки в регулярном выражении, иначе она станет другой группой. Это предполагает, что в вашей строке есть буквальные скобки. Я подозреваю, о чем вы говорили в первоначальном вопросе, поскольку ваш шаблон на самом деле является вашей строкой.
Запрос: это "КОМПАНИЯ", "ASP" и "INC". требуется?
Если у вас должны быть значения для них, то вы хотите использовать + вместо *, + - 1 или больше, * равно нулю или больше, поэтому * будет соответствовать строковой букве "()"
например: "((. +?))"
Протестировано с помощью 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*\\)+");
Не прямой ответ на ваш вопрос, но я рекомендую использовать RegxTester, чтобы быстро получить ответ и любой будущий вопрос. Это позволяет вам тестировать в реальном времени.
Если ваши строки всегда будут выглядеть так, вы можете уйти, просто используя пару вызовов вместо replaceAll. Кажется, это работает для меня:
String eName = "(COMPANY) -277.9887 (ASP,) -277.9887 (INC.)";
String eNameEdited = eName.replaceAll("\\).*?\\("," ").replaceAll("\\(|\\)","");
System.out.println(eNameEdited);
Вероятно, это не самая эффективная вещь в мире, но довольно простая.