【问题标题】:Pattern to extract text between parenthesis提取括号之间文本的模式
【发布时间】:2014-08-07 00:47:26
【问题描述】:

如何使用模式匹配或任何东西从"("")" 中提取字符串。例如,如果文本是

“你好(Java)”

那如何只得到"Java"

【问题讨论】:

  • 到目前为止你尝试过什么?你想用嵌套括号发生什么,例如“你好(Foo和(Bar))”?有多个括号值的情况,比如“Hello (Foo) and (Bar)”呢?

标签: java regex


【解决方案1】:

试试这个:

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

【讨论】:

  • 如果我的输入字符串具有相同的架构,但我想提取它的两个部分。 str1="Hello "str2="Java"。我怎样才能实现它?
【解决方案2】:
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中保留,所以我们需要转义这个字符,\\)(.*?)同样的事情将匹配任何字符零次或更多次此外,() 中的任何内容都被视为我们正在寻找的组。

【讨论】:

  • 如何获取表达式 ["1","5","7"] 中的字符串。结果应该是“1”、“5”和“7”。我们应该像这样使用:Pattern regex = Pattern.compile("\\[(.*?)\\]");
  • @user1182217 您可以使用Pattern regex = Pattern.compile("(\".*?\")"); 并使用matcher 来获取grop 1。
【解决方案3】:

还有比使用正则表达式更简单的东西:

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

在您的示例中,result 将作为“Java”返回。我会推荐 StringUtils 库用于各种(相对简单的)字符串操作;它会自动处理空输入之类的事情,这很方便。

substringBetween() 的文档: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#substringBetween-java.lang.String-java.lang.String-java.lang.String-

这个函数还有另外两个版本,取决于开始和结束分隔符是否相同,以及分隔符是否在目标字符串中出现多次。

【讨论】:

    【解决方案4】:

    你实际上应该使用

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

    \(([^()]*)\) 正则表达式匹配:

    • \( - 一个 ( 字符
    • ([^()]*) - 第 1 组:除 () 之外的任何零个或多个字符
    • \) - ) 字符。

    [^()] 是一个否定字符类,在初始 (\( 匹配后,它不可能匹配另一个 (,因此,它确保 innermost 匹配两个括号对。

    请参阅Java demo onlineregex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2017-07-30
      • 2011-01-25
      • 1970-01-01
      相关资源
      最近更新 更多