【问题标题】:Java: Extracting multiple values from a String using RegExJava:使用 RegEx 从字符串中提取多个值
【发布时间】:2022-02-03 13:59:02
【问题描述】:

我需要从以下多行字符串中提取 VALUE1、VALUE2 和 VALUE3:

String input = "aa a\r\na aa \r\na getString(\"VALUE1\");aagetInt(\"VALUE2\");aa\r\n a getString(\"VALUE3\"); aaa\r\naaa";

我试过了:

Pattern pattern = Pattern.compile("\"(\\S+)\"+");
Matcher matcher = pattern.matcher(input);
while (matcher.find())
    System.out.println(matcher.group(1));

但这会产生:

VALUE1\");aagetInt(\"VALUE2\");aa\r\n a getString(\"VALUE3

它包含第一个和最后一个引号之间的所有内容。

然后我尝试了这个:

"(.*)get(\\S+)\\(\"(\\S+)\"(.*)"

但这只需要最后一个匹配项 VALUE3(使用 matcher.group(3))。

如何获取所有 3 个值:VALUE1、VALUE2、VALUE3?

【问题讨论】:

  • 使用Pattern.compile("\"([^\"])\"")。请注意,如果允许VALUE1 等的实际值包含",这将变得更加困难。
  • 这能回答你的问题吗? Getting match of Group with Asterisk?

标签: java regex


【解决方案1】:

你的模式有点不对劲。使用这个版本:

String input = "aa a\r\na aa \r\na getString(\"VALUE1\");aagetInt(\"VALUE2\");aa\r\n a getString(\"VALUE3\"); aaa\r\naaa";
Pattern p = Pattern.compile("\\w+\\(\"(.*?)\"\\)");
Matcher m = p.matcher(input);
while (m.find())
    System.out.println(m.group(1));

打印出来:

VALUE1
VALUE2
VALUE3

【讨论】:

    【解决方案2】:

    使用\S+ 匹配所有非空白字符,使用.* 首先匹配行尾,所以在这两种模式中你匹配的太多了。

    获取以get开头的括号中的值并使用非贪婪\S+?(注意不匹配空格):

    get[^\s()]*\("(\S+?)"\)
    

    Regex demo

    例子:

    String input = "aa a\r\na aa \r\na getString(\"VALUE1\");aagetInt(\"VALUE2\");aa\r\n a getString(\"VALUE3\"); aaa\r\naaa";
    String regex = "get[^\\s()]*\\(\"(\\S+?)\"\\)";
    
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);
    
    while (matcher.find()) {
       System.out.println(matcher.group(1));            
    } 
    

    输出

    VALUE1
    VALUE2
    VALUE3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-02
      • 2011-06-26
      • 2020-06-10
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多