Регулярное выражение для поиска элементов без определенного атрибута (например, «id») - PullRequest
3 голосов
/ 13 октября 2011

Я пролистываю большое количество файлов на основе XML в проекте JSF и хотел бы найти некоторые компоненты, в которых отсутствует атрибут ID. Например, скажем, я хочу найти все элементы <h:inputText />, которые не имеют указанный атрибут id.

Я попробовал следующее в RAD (Eclipse), но что-то не так, потому что я все еще получаю некоторые компоненты, которые имеют действительный идентификатор.

<([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 Ответ

3 голосов
/ 13 октября 2011

Отказ от ответственности:

Как правильно указывают другие, лучше всего использовать выделенный анализатор при работе с нерегулярными языками разметки, такими как 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';

А вот то же регулярное выражение в голомсобственный формат -bones, который может быть подходящим для копирования и вставки в окно поиска Eclipse:

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

Обратите внимание на группу имен целевых элементов, которые должны быть сопоставлены в начале этого выражения.Вы можете добавить или вычесть нужные целевые элементы в этот список ORed.Также обратите внимание, что это выражение разработано для хорошей работы как для HTML, так и для XML (который может иметь атрибуты без значения, значения атрибутов без кавычек и значения атрибутов в кавычках, содержащие <> угловые скобки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...