2013-04-19 4 views
0

Маркер может быть, как это {num} или {num:2} (2 Будучи арг)Regex маркер матча с аргументом

Я хотел бы, чтобы достичь соответствия так:

// no args 
[0] = num 

// args (anything after the colon and before the closing brace as one match is fine) 
[0] = num 
[1] = 2 

мне удалось соответствовать что-нибудь в скобки, которые были легкими, но мое регулярное выражение слишком нуб, чтобы получить что-то более сложное, чем это! Благодарю.

FYI Я использую javascript и \{(.*?)\} соответствует всему содержанию.

+0

a) Какой язык или инструмент вы используете? б) пожалуйста, покажите нам свою собственную попытку. –

ответ

1

Вы могли бы сделать что-то вроде этого:

\{(.*?)(?::(.*?))?\} 

И тест:

> '{foo:bar}'.match(/\{(.*?)(?::(.*?))?\}/) 
["{foo:bar}", "foo", "bar"] 
> '{foo}'.match(/\{(.*?)(?::(.*?))?\}/) 
["{foo}", "foo", undefined] 
  • (.*?) без жадности соответствует первой группе.
  • (?:...) - группа, не связанная с захватом. Это как обычная группа захвата, но она не попадает в плен.
  • :(.*?) захватывает материал после толстой кишки.
  • ? делает эту последнюю группу (которая содержит двоеточие и вторую группу захвата) необязательно.
+0

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