用于查找没有特定属性的元素的正则表达式(例如,“id”)

时间:2011-10-13 17:33:30

标签: regex eclipse xml-parsing

我正在浏览JSF项目中的大量基于XML的文件,并希望找到缺少ID属性的某些组件。例如,假设我想找到的所有<h:inputText />元素都指定了id属性。

我在RAD(Eclipse)中尝试了以下内容,但有些不太正确,因为我仍然得到某些具有有效ID的组件。

<([hf]|ig):(?!output)\w+\s+(?!\bid\b)[^>]*?\s+(?!\bid\b)[^>]*?>

不确定我的负面预测是否正确?

期望的结果是我会在项目的任何JSP中找到以下(或类似的):

<h:inputText value="test" />

...但

<h:inputText id="good_id" value="test" />

我只是以<h:inputText/>为例。我试图扩大范围,但绝对排除<h:outputText/>

1 个答案:

答案 0 :(得分:3)

声明:

正如其他人正确指出的那样,在使用非常规标记语言(如XML / HTML)时最好使用专用解析器。正则表达式解决方案有许多方法可能会出现误报或错误匹配。

那说......

这个特殊问题是一次性编辑问题,目标文本(开放标记)不是嵌套结构。虽然以下正则表达式解决方案有办法失败,但它仍然应该做得很好。

我不知道Eclipse的正则表达式语法,但是如果它提供了负面预测,则以下是一个正则表达式解决方案,它将匹配没有ID属性的特定目标元素的列表:(首先,在PHP / PCRE中呈现自由间隔模式注释语法以便于阅读)

$re_open_tags_with_no_id_attrib = '%
    # Match specific element open tags having no "id" attribute.
    <                    # Literal "<" start of open tag.
    (?:                  # Group of target element names.
      h:inputText        # Either h:inputText element,
    | h:otherTag         # or h:otherTag element,
    | h:anotherTag       # or h:anotherTag element.
    )                    # End group of target element names.
    (?:                  # Zero or more open tag attributes.
      \s+                # Whitespace required before each attribute.
      (?!id\b)           # Assert this attribute not named "id".
      [\w\-.:]+          # Non-"id" attribute name.
      (?:                # Group for optional attribute value.
        \s*=\s*          # Value separated by =, optional ws.
        (?:              # Group of attrib value alternatives.
          "[^"]*"        # Either double quoted value,
        | \'[^\']*\'     # or single quoted value,
        | [\w\-.:]+      # or unquoted value.
        )                # End group of value alternatives.
      )?                 # Attribute value is optional.
    )*                   # Zero or more open tag attributes.
    \s*                  # Optional whitespace before close.
    /?                   # Optional empty tag slash before >.
    >                    # Literal ">" end of open tag.
    %x';

以下是裸机本机格式的相同正则表达式,可能适合复制并粘贴到Eclipse搜索框中:

<(?:h:inputText|h:otherTag|h:anotherTag)(?:\s+(?!id\b)[\w\-.:]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[\w\-.:]+))?)*\s*/?>

请注意要在此表达式的开头匹配的目标元素名称组。您可以将所需的目标元素添加或减去此ORed列表。另请注意,此表达式适用于HTML和XML(可能具有无值属性,不带引号的属性值和包含<>尖括号的带引号的属性值)。