具有运行时输入和一些异常情况的正则表达式模式和匹配器

时间:2012-01-18 07:43:15

标签: java regex

在java文件中,我读了jsp文件并尝试使用下面的正则表达式查找使用的css clasess的数量,“class =”及其值。

Pattern p = Pattern.compile("class=\"([^\"]*)\"");
Set set = new HashSet();
Iterator iterator;
while ((strLine = br.readLine()) != null)
{
    Matcher m = p.matcher(strLine);
}
while (m.find())
{
    String classValue = m.group(1);
    set.add(classValue);
}

它给了我类名,意思是jsp contents class =“List”或class =“listItem”。

输出为{ List listItem }。如果我的JSP内容

,我的问题如下
  1. 然后会显示我不想要的com.metaparadigm.jsonrpc.JSONRPCBridge
  2. “&gt;在这里它会给我output = "<%=w_canEdit?",但我只想要一个类IconSpacing或IconDisable如何做到这一点

1 个答案:

答案 0 :(得分:0)

<强>问题

假设我已正确解密它,从您的加密说明开始!

在我看来你的jsp页面包含以下行

<img src="a.jpeg" class="<%=w_canEdit?"IconSpacing":"IconDisable"%>"/>

您的正则表达式与<%=w_canEdit?\

匹配
@Test
public void testRegex() {

    Pattern p = Pattern.compile("class=\"([^\"]*)\"");
    Set set = new HashSet();


    //<img class="<%=w_canEdit?"IconSpacing":"IconDisable"%>" src="a.jpeg"/>
    String str="<img src=\"a.jpeg\" class=\"<%=w_canEdit?\"IconSpacing\":\"IconDisable\"%>\"/>";
    System.out.println(str);


    Matcher m = p.matcher(str);
    while (m.find())
    {
        String classValue = m.group(1);
        set.add(classValue);
    }
            System.out.println("Result:");
    System.out.println(set);
}

<强>输出

Input:
<img src="a.jpeg" class="<%=w_canEdit?"IconSpacing":"IconDisable"%>"/>
Result:
[<%=w_canEdit?]

您对结果的期望

[IconSpacing,IconDisable]

<强>答案

简答:

你不能用正则表达式

答案很长:

您无法使用正则表达式执行此操作,即使使用lookahead hacks您可以将其解析为<%=w_canEdit?"IconSpacing":"IconDisable"%>,例如使用以下模式

Pattern p = Pattern.compile("class=\"(<%=(.(?<!%>\"))*)\"");
// [<%=w_canEdit?"IconSpacing":"IconDisable"%>]

通过解析jsp文件,您仍然无法识别class [作为IconSpacingIconDisable]的运行时值。

最简单的方法是手动执行

  1. grep class= *.jsp
  2. 识别其中包含jsp scriptlet的css类
  3. 从结果中提取所需的详细信息
  4. 如果您可以针对您的要求的具体细节提出单独的问题,那么人们将非常乐意为您提供帮助


    另请参阅此帖子RegEx match open tags except XHTML self-contained tags以了解为什么使用正则表达式解析html / jsp页面并不是一个好主意!