шаблон регулярного выражения и средство сопоставления с вводом во время выполнения и некоторыми исключениями - PullRequest
0 голосов
/ 18 января 2012

В java-файле я читаю jsp-файл и пытаюсь выяснить количество используемых css-слов, "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. "> в этом он даст мне output = "<%=w_canEdit?", но я хочу только один класс - IconSpacing или IconDisable, как это можно сделать

1 Ответ

0 голосов
/ 18 января 2012

Вопрос

Из вашего зашифрованного описания при условии, что я правильно его расшифровал!

Мне кажется, что ваша страница 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"%>, как для ex, используя следующий шаблон

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

вы все равно никогда не сможете идентифицировать значение времени выполнения class [как IconSpacing или IconDisable] путем анализа файла jsp в любом случае.

Самый простой способ сделать это - сделать это вручную

  1. grep class= *.jsp
  2. идентифицирует классы css, в которых есть jsp скриптлеты
  3. извлеките необходимые данные из результата

Если вы можете поднять отдельный Вопрос с точными деталями вашего требования, люди здесь будут рады помочь


Также см. Этот пост RegEx соответствует открытым тегам, за исключением автономных тегов XHTML , чтобы понять, почему использование регулярных выражений для анализа html / jsp-страниц не является отличной идеей!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...