Шаблон для извлечения текста в скобках

Как извлечь строку из "(" а также ")" используя сопоставление с образцом или что-нибудь. Например, если текст

"Привет (Java)"

Тогда как достать только "Java",

Благодарю.

4 ответа

Решение

Попробуй это:

 String x= "Hello (Java)";
 Matcher m = Pattern.compile("\\((.*?)\\)").matcher(x);
while(m.find()) {
    System.out.println(m.group(1));
}

или же

String str = "Hello (Java)";
String answer = str.substring(str.indexOf("(")+1,str.indexOf(")"));
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("\\((.*?)\\)");
Matcher regexMatcher = regex.matcher("Hello This is (Java) Not (.NET)");

while (regexMatcher.find()) {//Finds Matching Pattern in String
   matchList.add(regexMatcher.group(1));//Fetching Group from String
}

for(String str:matchList) {
   System.out.println(str);
}

ВЫХОД

Java
.NET

Что значит \\((.+?)\\) имею в виду?

Этот шаблон регулярного выражения будет начинаться с \\( который будет соответствовать ( как это зарезервировано в regExp, поэтому нам нужно экранировать этот символ, то же самое для \\) а также (.*?) будет соответствовать любому символу ноль или более раз что-нибудь еще в () рассматривается как группа, которую мы находим.

Я знаю, что это было задано 3 года назад, но для любого с таким же / похожим вопросом, который задается здесь (как я сделал), есть кое-что даже более простое, чем использование регулярных выражений:

String result = StringUtils.substringBetween(str, "(", ")");

В вашем примере result будет возвращен как "Java". Я бы порекомендовал библиотеку StringUtils для различных (относительно простых) манипуляций со строками; он обрабатывает такие вещи, как нулевые вводы автоматически, что может быть удобно.

Документация для substringBetween (): https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

Существуют две другие версии этой функции, в зависимости от того, являются ли открывающий и закрывающий разделители одинаковыми, и встречаются ли разделители в целевой строке несколько раз.

Вы действительно должны использовать

      List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("\\(([^()]*)\\)");
Matcher regexMatcher = regex.matcher("Hello This is (Java) Not (.NET)");

while (regexMatcher.find()) {
   matchList.add(regexMatcher.group(1));
}

for(String str:matchList) {
   System.out.println(str);
}

The \(([^()]*)\)регулярное выражение соответствует:

  • - уголь
  • ([^()]*)- Группа 1: любой ноль или более символов, кроме и
  • \)- а )чар.

The [^()]— это отрицательный класс символов, который делает невозможным сопоставление с другим после начального (совпадает с \(, таким образом, он обеспечивает самые внутренние совпадения между двумя парами скобок.

См. демонстрацию Java в Интернете и демонстрацию регулярных выражений.

Другие вопросы по тегам