2

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

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

期望的结果是所有 cond 变量的名称 - Event,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++;

                    }
                }
4

2 回答 2

0

如果我很好地理解了您的要求,这可能会起作用:

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

$2将给每个条件变量名称。

它的作用是:

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

!?一个可选的

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

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

'.*?'''中的零个或多个字符

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

添加所需的转义\

编辑:对于您指定的附加条件,以下可能就足够了:

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

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

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

(\[\d+\]|\..*?)?可选部分,由方括号中的数字组成,或由点后跟零个或多个字符组成

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

$2将给出变量名称。

这里第二个捕获组正在(\w+?)检索变量名称,第三个捕获组检索任何存在的后缀(例如:[2]in Event[2])。

对于包含条件的输入Event.indexOf(2)=something,仅$2给出Event。如果你想让它被Event.indexOf(2)使用$2$3

于 2013-02-13T13:19:55.233 回答
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
于 2013-02-14T08:40:13.610 回答