regex
2010-07-28 5 views 1 likes 
1

Ok я получил это регулярное выражение:Regex Обеспечение выполнения матча

^[\w\s]+=["']\w+['"] 

Теперь регулярное выражение будет соответствовать:

A HREF = 'Google'

A HREF = "Google"

и также

a href = 'google "

Как я могу заставить регулярное выражение соответствовать его цитате?
Если первая цитата апостроф, как я могу сделать последняя цитата также одинарные кавычки не двойные кавычки

ответ

6

Читайте о backreferences.

^[\w\s]+=(["'])\w+?\1 

Обратите внимание, что вы хотите поставить ? после второго + или иначе это будет жадничать. Однако, в общем, это не правильный способ анализа HTML. Используйте Beautiful Soup.

+0

Я видел, как \ 1 используется в javascript, но не на другом языке, особенно в php. Можно ли использовать на другом языке такие php? – slier

+0

Да. Это часть регулярного выражения. – katrielalex

+0

Да, на PHP это работает. – Wrikken

0

Попробуйте это:

^[\w\s]+="\w+"|^[\w\s]+='\w+' 
0

Я боюсь, что вы должны будете сделать это долгий путь:

^[\w\s]+=("\w+"|'\w+') 

Более технически, обеспечение правильного соответствия/вложенности цитат не является проблемой для регулярной грамматики, так и для более сложных проблем, которые бы для использования правильного анализатора (или расширенного регулярного выражения в стиле perl6, но они технически не классифицируются как регулярные выражения).

+0

Not true. Вы можете записать первую цитату, а затем обратную ссылку. – katrielalex

+0

Да, но если вы это сделаете, ваше регулярное выражение технически не является регулярным выражением, поэтому мое утверждение имеет место (хотя это отличный подход). – ternaryOperator

0

Заменить ['"] с \1 использовать ссылку обратно (захват группы)

^[\w\s]+=["']\w+\1

0

Что именно вы хотите, чтобы соответствовать?Это звуки, которые вы хотите, чтобы соответствовать:

  • слово (тэг)
  • обязательным пробельные
  • слово (атр название)
  • необязательные пробелы
  • =
  • необязательные пробелы
  • либо одинарные кавычки или двойного котирования (значение attr)

Это было бы: ^(\w+)\s+(\w+)\s*=\s*(?:'([^']*)'|"([^"]*)")

Это позволит матчи, как:

  • a href='' - пустой атр
  • a href='Hello world' - пробелы и другие символы, не слово в кавычках части
  • a href="one 'n two" - котировки различного вида в котируемой части
  • a href = 'google' - пространства с обеих сторон =

и запретить такие вещи, как это, что ваш оригинальный регулярное выражение позволяет:

  • a b c href='google' - дополнительные слова
  • ='google' - только пространства на левом
  • href='google' - только Attr на левом

Он по-прежнему звучит не совсем правильно - вы пытаетесь сопоставить тег с одним атрибутом?

С помощью этого регулярного выражения, имя тега будет в $1, атр имя в $2 и значение атр в любом $3 или $4 (другой ноль - большинство языков различают группы не принято с нуля против группы принято, но пустой с "" если Вы нуждаетесь в этом).

Regexp, который обеспечивал бы атр значение приобретает в той же группе будет грязнее, если вы хотите, чтобы одиночные кавычки в двукратно цитируемом значении атра и наоборот - что-то вроде ^(\w+)\s+(\w+)\s*=\s*(['"])((?:(?!\3).)*)\3 ((?!) нулевой ширины отрицательного взгляда вперед - (?:(?!\3).) средства что-то вроде [^\3], за исключением последнего не поддерживается).

Если вы не заботитесь об этом, то ^(\w+)\s+(\w+)\s*=\s*(['"])(['"]*)\3 будет делать только штраф (для обоих $3 будет тип котировки, а $4 значение attr).

Кстати, re (["'])\w+?\1 выше - \w не соответствует котировкам, поэтому этот ? ничего не изменит.

Сказав все это, использовать реальный HTML анализатор ;-)

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

Смежные вопросы