Шаблон для извлечения текста в скобках
Как извлечь строку из "("
а также ")"
используя сопоставление с образцом или что-нибудь. Например, если текст
"Привет (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 в Интернете и демонстрацию регулярных выражений.