Regex: Строка XPATH указывает на атрибут? - PullRequest
1 голос
/ 11 ноября 2009

Вот что я использую: ". + / @ [^ /] + $". Можете ли вы вспомнить причину, по которой это может не сработать?

1 Ответ

2 голосов
/ 11 ноября 2009

Это на самом деле очень тонкая проблема, и я думаю, что отличный вопрос.

Насколько я понимаю, (сокращенно) XPATH указывает на атрибут, если и только его последний @ не находится в предикате, то есть что-то в форме [...] и не имеет шаги после него (что-то вроде /...). Я думаю, что это имеет относительно простое регулярное выражение @[^]/]*$, то есть должно быть @, которое не имеет ни ] с, ни / с после него. Кроме того, если вы хотите использовать несокращенные XPATH, вы можете использовать (@|attribute::)[^]/]*$

Я включил тестовый комплект, который может оказаться полезным при проверке этого или других тестов. Также обратите внимание, что между токенами могут быть пробелы, которые могут усложнять некоторые регулярные выражения.

Позитив (атрибут)

  • @* или @a или ../@a или a/@b
  • a[@b and @c]/@d
  • a[b[@c="d"]/e[@f and @g]]/h[@i="j"]/@k

Отрицательный (не атрибут)

  • a[@b] или a[@b and @c]
  • a[b[@c and @d]/@e]
  • a[b[@c="d"]/e[@f and @g]]/h[@i="j"]/k[5][@l="m"]

Я не могу вспомнить юридический пример, где есть /, но нет ] после последнего примера, но я думаю, что может быть один.

Надеемся, что эти примеры хотя бы немного прояснят, что может быть произвольное вложение [ и ] вместе с @ s где-нибудь между ними. К счастью, я думаю, что только самый последний @ и его уровень вложенности имеют значение.

(Для справки: регулярное выражение OP не выполняется на @a. Мое исходное регулярное выражение не выполнено на a[@b and @c].)

Редактировать : Оказывается, что есть больше угловых случаев, что убеждает меня в том, что не существует абсолютно правильного регулярного выражения. Например, если у вас есть узел атрибута, есть много способов его сохранить, например, //@a// или //@a/. в сокращенном синтаксисе. Есть также множество более креативных способов, таких как //@f//[node()]. В общем, кажется, что если вы хотите охватить эти случаи, вы должны иметь возможность сопоставлять [ и ], чего не может сделать основное регулярное выражение. С другой стороны, вы можете решить, что это слишком надумано ...

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