ReGex模式匹配<c:if>条件变量名称?</c:if>

时间:2013-02-13 12:13:34

标签: java regex jsp

我需要获取特定jsp中所有情况的条件变量名称 我正在逐行读取jsp并搜索特定模式,比如一行说它检查两种类型的cond,它找到匹配

       <c:if condition="Event ='Confirmation'">
       <c:if condition="Event1 = 'Confirmation' or Event2 = 'Action'or Event3 = 'Check'" .....>

所需结果是所有cond变量的名称 - 事件,Event1,Event2,Event3 我编写的解析器只满足第一种情况但无法找到变量第二种情况的名称。需要一种模式来满足它们。

    String stringSearch = "<c:if";
    while ((line = bf.readLine()) != null) {
                // Increment the count and find the index of the word
                lineCount++;
                int indexfound = line.indexOf(stringSearch);

                if (indexfound > -1) {

                    Pattern pattern = Pattern
                            .compile(test=\"([\\!\\(]*)(.*?)([\\=\\)\\s\\.\\>\\[\\(]+?));

                    Matcher matcher = pattern.matcher(line);
                    if (matcher.find()) {

                        str = matcher.group(1);
                        hset.add(str);
                        counter++;

                    }
                }

2 个答案:

答案 0 :(得分:0)

如果我理解你的要求,这可能有效:

("|\s+)!?(\w+?)\s*=\s*'.*?'

$2将为每个条件赋予变量名称。

它的作用是:

("|\s+) 一个或多个空格

!?可选

(\w+?)一个或多个单词字符(字母,数字或下划线)(([A-Za-z]\w*)会更正确)

\s*=\s* = 前后加零或多个空格

'.*?' ''

内的零个或多个字符

第二个捕获组是(\ w +?)检索变量名称

\

添加所需的转义功能

编辑:对于您指定的其他条件,以下内容可能就足够了:

("|or\s+|and\s+)!?(\w+?)(\[\d+\]|\..*?)?\s*(!?=|>=?|<=?)\s*.*?

("|or\s+|and\s+) 后跟一个或多个空格或后跟一个或多个空格。 (这里,假设每个表达式部分或变量名称前面都有后跟一个或多个空格或后跟一个或多个空格)

!?(\w+?)可选的后跟一个或多个单词字符

(\[\d+\]|\..*?)?一个可选部分构成用方括号括起来的数字一个点后跟零个或多个字符

(!?=|>=?|<=?)以下任何关系运算符:=,!=,&gt;,&lt;,&gt; =,&lt; =

$2将提供变量名称。

此处第二个捕获组是(\w+?)检索变量名称,第三个捕获组检索任何后缀(如果存在)(例如:[2]中的Event[2])。

对于包含条件Event.indexOf(2)=something的输入,$2仅提供Event。如果您希望Event.indexOf(2)使用$2$3

答案 1 :(得分:0)

这可能符合您的需求:

"(\\w+)\\s*=\\s*(?!\")"

这意味着:

Every word followed by a = that isn't followed by a "

例如:

String s = "<c:if condition=\"Event ='Confirmation'\"><c:if condition=\"Event1 = 'Confirmation' or Event2 = 'Action'or Event3 = 'Check'\" .....>";
Pattern p = Pattern.compile("(\\w+)\\s*=\\s*(?!\")");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}

打印:

Event
Event1
Event2
Event3