2

我正在编写一个实用程序来从 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 和正则表达式来提取这些标头名称。

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

编辑:

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

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

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

1 回答 1

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()); 
}
于 2012-10-04T19:57:39.653 回答