我正在浏览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/>
。
答案 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(可能具有无值属性,不带引号的属性值和包含<>
尖括号的带引号的属性值)。