【问题标题】:ReGex patten to match <c:if > conditional variable names?匹配 <c:if > 条件变量名称的正则表达式模式?
【发布时间】:2013-01-28 23:39:51
【问题描述】:

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

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

Desired Result 是所有 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++;

                    }
                }

【问题讨论】:

  • 是的,每次循环迭代都编译模式...

标签: java regex jsp


【解决方案1】:

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

("|\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+) 一个 " 或一个 or 后跟一个或多个空格或一个 and 后跟一个或多个空格。(此处, 假设每个表达式部分或变量名前面有一个 " 或一个 or 后跟一个或多个空格或一个 and一个或多个空格)

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

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

组成

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

$2 会给出变量名。

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

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

【讨论】:

  • 首先我需要考虑“test=”,因为jsp中可能还有其他属性,所以只需要为“test”获取。其次,变量名称包含特殊字符,也像 arr[1]=23 或者它可以是布尔值,如 !var 和 cond 可以变化,如 >,!=,
  • @PramitBhaumik 你的例子没有提到这一点。
  • @PramitBhaumik 如果您添加一些显示您的要求的示例,将会很有帮助。
  • @Naveed...你可以考虑像 这样的逻辑操作
  • @PramitBhaumik 检查编辑后的答案是否符合您的要求
【解决方案2】:

这可以满足您的需求:

"(\\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

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2016-01-22
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多