使用Java中的RegEx在括号中提取参数

时间:2012-10-04 19:51:22

标签: java regex regex-lookarounds

我正在编写一个实用程序来从JSP中提取头文件的名称。我没有问题,逐行读取JSP并找到我需要的行。我在使用正则表达式提取所需的特定文本时遇到问题。在看了很多类似的问题后,我正在碰壁砖。

我将从内部匹配的字符串示例是:

<jsp:include page="<%=Pages.getString(\"MY_HEADER\")%>" flush="true"></jsp:include>

这个例子我只需要MY_HEADER。任何时候我都有这个标签:

<%=Pages.getString

我需要介于此之间:

<%=Pages.getString(\"  and this: )%>

以下是我目前的情况(我可能会补充说明不起作用):

String currentLine;
while ((currentLine = fileReader.readLine()) != null)
{
Pattern pattern = Pattern.compile("<%=Pages\\.getString\\(\\\\\"([^\\\\]*)"); 
Matcher matcher = pattern.matcher(currentLine); 
while(matcher.find()) {
System.out.println(matcher.group(1).toString());                           
}}

我需要能够使用Java RegEx API和regex来提取这些标题名称。

非常感谢您对此问题的任何帮助。谢谢!

编辑:

谢天谢地解决了这个问题。在给出正确的正则表达式后,棘手的部分是必须考虑到我正在为正则表达式提供的字符串总是将有两个“/”字符((/“MY_HEADER “/))需要在模式中进行转义。

这是有效的(感谢帮助; - )):

Pattern pattern = Pattern.compile("<%=Pages\\.getString\\(\\\\\"([^\\\\\"]*)"); 

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

<%=Pages\\.getString\\(\\\\\"([^\\\\]*)

是的,这是一个可怕数量的反斜杠。 matcher.group(1)应该返回MY_HEADER。它从\"开始并匹配所有内容,直到下一个\(我假设此处为\")%>。)

当然,如果目标文本包含反斜杠(\),则无效。但是你没有表明你曾经在寻找像<%=Pages.getString(\"Fun!\Yay!\")%>这样的东西 - 这个正则表达式只会返回Fun!而忽略其余的。

修改

您的测试用例失败的原因是您使用此测试字符串:

String currentLine = "<%=Pages.getString(\"MY_HEADER\")%>"; 

这相当于从文件中读取它并看到:

<%=Pages.getString("MY_HEADER")%> 

请注意缺少任何\。你需要改用它:

String sCurrentLine = "<%=Pages.getString(\\\"MY_HEADER\\\")%>"; 

这相当于你想要的东西。

这是可行的测试代码:

String currentLine = "<%=Pages.getString(\\\"MY_HEADER\\\")%>"; 
Pattern pattern = Pattern.compile("<%=Pages\\.getString\\(\\\\\"([^\\\\]*)"); 
Matcher matcher = pattern.matcher(currentLine); 
while(matcher.find()) {
    System.out.println(matcher.group(1).toString()); 
}