【问题标题】:Java: Obtain matched string from an inputJava:从输入中获取匹配的字符串
【发布时间】:2011-11-15 11:07:49
【问题描述】:

我正在尝试使用我提供的表达式获取我的匹配器能够找到的字符串。像这样的..

if(matcher.find())
    System.out.println("Matched string is: " + ?);

什么是合适的代码?根据Oracle

matcher.group();

方法只返回与

相同的提供的输入
matcher.group(0);

提前谢谢..

编辑:

示例如下:

private static String fileExtensionPattern = ".*<input type=\"hidden\" name=\".*\" value=\".*\" />.*";
private static Matcher fileXtensionMatcher;
private static String input = text  "<html><body><table width="96"><tr><td><img src=&quot;file:/test&quot;  /><input type="hidden" name="docExt" value=".doc" />Employee Trv Log 2011 Training Trip.doc</td></tr></table></body></html>"

private static void findFileExtension() {
    System.out.println("** Searching for file extension **");
    System.out.println("Looking for pattern: " + fileExtensionPattern);
    fileXtensionMatcher = fileXtensionExp.matcher(input);

    if(fileXtensionMatcher.find()) {
        //the extension expression is contained in the string
        System.out.println("Extension expression found.");
        System.out.println(fileXtensionMatcher.group());
    }
}

得到的结果是:

text    "<html><body><table width="96"><tr><td><img src=&quot;file:/test&quot;  /><input type="hidden" name="docExt" value=".doc" />Employee Trv Log 2011 Training Trip.doc</td></tr></table></body></html>"

【问题讨论】:

  • 你试过了吗?如果您这样做了,您就会知道matcher.group() 将完全满足您的需求。
  • @Marcelo 请阅读对最后一个答案的评论
  • 在看到你的源代码后添加了一个答案。

标签: java regex matcher


【解决方案1】:

你认为group()为什么会返回输入?

根据the JavaDoc

返回上一个匹配匹配的输入子序列。

换句话说:它返回匹配的输入的那部分

【讨论】:

  • 不幸的是,这就是我的结果。
  • @NecArn:请提供一个示例,因为我知道group() 返回输入的加工部分。
  • 感谢@Joachim,该方法的名称对我来说不够清楚。在不了解结果组的情况下,它使我相信错误出在方法中,而不是提供的正则表达式中。
【解决方案2】:

添加源代码后,我可以向您保证,group() 会返回整个输入字符串,因为它与您的正则表达式匹配。如果您只想要 &lt;input&gt; 元素,请使用:

private static String fileExtensionPattern = "<input type=\"hidden\" name=\".*\" value=\".*\" />";

或使用:

private static String fileExtensionPattern = ".*(<input type=\"hidden\" name=\".*\" value=\".*\" />).*";
. . .
System.out.println(fileXtensionMatcher.group(1));

【讨论】:

  • 谢谢,问题是带有“.*”的正则表达式。正如您所说,它匹配整个字符串,并且 group() 结果返回整个字符串。从开头和结尾删除“。*”给了我结果。
【解决方案3】:

看到您的更新后,您似乎需要匹配器组。您还需要使您的匹配不贪心(.*? 而不是.*)。试试这个:

private static String fileExtensionPattern = 
    ".*<input type=\"hidden\" name=\".*?\" value=\"(.*?)\" />([^<]*)";

// etc.
private static void findFileExtension() {

     // etc.
     if(fileXtensionMatcher.find()) {
        // etc.
        System.out.println(fileXtensionMatcher.group(1));
        System.out.println(fileXtensionMatcher.group(2));
    }
}

【讨论】:

  • 非常感谢您的回答。这个结果实际上节省了我在下一个结果中使用 (.*?) 作为值字段和组 (2) 来提取扩展名的工作。
  • 正如@Marcelo 所说,主要问题是正则表达式两端的.* 无关紧要。但这是使量词的重置不贪婪的一个很好的观点。您也可以将\"[^\"]*\" 用于属性值。
猜你喜欢
  • 2023-04-11
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
相关资源
最近更新 更多