2010-02-09 3 views
2

Я хочу регулярное выражение, которое будет соответствовать:Проблема с регулярным выражением

Тип с идентификатором:

[Image=4b5da003ee133e8368000002] 
[Video=679hfpam9v56dh800khfdd32] 

С между 0 и п дополнительные опции разделены @:

[[email protected]:small] 
[[email protected]:[email protected]:true] 

У меня это до сих пор:

\[[a-zA-Z]*=[a-zA-Z0-9]*[@[a-zA-Z]*:[a-zA-Z]*]*\] 

... но это не соответствует всем случаям.

+0

Это решение, но это заставило меня столкнуться с другой проблемой, рассмотренной здесь: http://stackoverflow.com/questions/2230372/getting-some-elements-in-a-string-using-a-regex – marcgg

ответ

5
\[[a-zA-Z]+=[a-zA-Z0-9]{24}(@[a-zA-Z]+:[a-zA-Z]+)*\] 
         ^    ^

Вы были заключая этот раздел с [], который, как вы знаете, для класса, вы просто хотите группировку. Вы также должны убедиться, что первое совпадение имеет хотя бы один символ, и кажется, что в блоке id есть 24 символа, если это используется в этом случае, {X} для определения повторения длины X.

+0

спасибо , это была проблема – marcgg

+0

Есть еще одна проблема: если вы это сделаете, она не получит все варианты, только последние. В примере « [Изображение = 4b5da003ee133e8368000002 @ size: small @ media: true]« Я могу получить только «@media: true», когда мне также нужен размер: true – marcgg

+0

Вот для чего нужен трейлинг *. если вы хотите сгруппировать секцию WHOLE в одну переменную, требуется другая пара круглых скобок и добавьте «?:» после открытия внутренних парен. Это позволит избежать создания обратной ссылки. Следующее совпадение для вас должно быть в следующей переменной в текущем случае. – nlucaroni

3

Не следует дополнительные опции группируются (вместо скобок!) и помечены как необязательные (вместо *)? И вы должны использовать + вместо *, иначе пустая строка будет сопоставлена.

\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]*:[a-zA-Z]*)*\] 
+0

Спасибо вам за ответ. nlucaroni был быстрее, поэтому он получил чек, но это тоже правильно. – marcgg

+0

Я бы расширил это и сделаю как ключ, так и значение, необходимое, когда имеется дополнительное поле, хотя ОП не учитывал это в вопросе , '\ [[a-zA-Z] + = [a-zA-Z0-9] + (@ [a-zA-Z] +: [a-zA-Z] +)? \]' –

+1

? является неверным квантором для (@ [a-zA-Z] *: [a-zA-Z] *). От 0 до n дополнительных опций. – Erlock

2
\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]+:[a-zA-Z]+)*\] 

Вам необходимо заключить необязательную группу в скобках, не скобки.

+0

Как я уже сказал андигону, нлукарони был быстрее, поэтому он получил чек, но это тоже правильно. Спасибо :) – marcgg

0
\[[a-zA-Z]+=[a-zA-Z0-9]+(@[a-zA-Z]+:[a-zA-Z]+)?\] 

Я думаю, что это будет немного лучше :)

1
^\[\w+=\w+(@\w+:\w+)*\]$ 

Я предполагаю, что это должно быть возможно более конкретно.

+1

Интересное решение, но оно также будет содержать символы подчеркивания, которые я не хочу – marcgg

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