2011-12-13 2 views
0

У меня есть следующий набор строк:Правильное регулярное выражение матч, содержащий дополнительные подстроки

some_param[name] 
some_param_0[name] 

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

/^(\D+)_?(\d{0,2})\[?(.*?)\]?$/.exec("some_param_0[name]") //works except for the trailing underscore on "some_param" 

Что было бы правильным регулярным выражением?

ответ

3
/^(\w+?)_?(\d{0,2})(?:\[([^\[\]]*)\])?$/ 

(\w+?) использует non-greedy quantifier, чтобы захватить часть идентификатора без каких-либо задней _.

_? жадный так будет бить +? в предыдущей части.

(\d{0,2}) будет захватывать 0-2 цифры. Он жадный, поэтому даже если между идентификатором и цифрами нет _, это будет записывать цифры.

(?:...)? делает квадратную секцию в квадратных скобках опциональной.

\[([^\[\]]*)\] захватывает содержимое квадратного квадратного скобки, которое не содержит квадратные скобки.

'some_param_0[name]'.match(/^(\w+?)_(\d{0,2})(?:\[([^\[\]]*)\])?$/) 

производит массив, как:

["some_param_0[name]", // The matched content in group 0. 
"some_param",   // The portion before the digits in group 1. 
"0",     // The digits in group 2. 
"name"]    // The contents of the [...] in group 3. 

Обратите внимание, что не жадный квантор может взаимодействовать странно с ограниченным повторением в \d{0,2}.

'x1234[y]'.match(/^(\w+?)_?(\d{0,2})(?:\[([^\[\]]*)\])?$/) 

дает

["x1234[y]","x12","34","y"] 
+0

Я думаю, он хочет удалить задние подчеркивания .. Я прав? Я пробовал использовать '/^([a-zA-Z _] +) (?: _ (\ D {0,2}))? (?: \ [([^ \ [\]] *) \])? $/', но похоже, что он не работает (по крайней мере, в Python) – redShadow

+0

@redShadow, RegExp в OP оставляет его из группы захвата 1, поэтому я предположил, что плакат захотел его. –

+0

Извините, в code comment Я упомянул, что я идеально хотел, чтобы нижнее подчеркивание было проигнорировано («some_param» вместо «some_param_»). Должно было быть ясно в вопросе. – fenderplayer

0

Пожалуйста, проверьте follwing регулярное выражение "(\ ш +) _ (\ d) [(\ ш +)]" йо может проверить его @http://rubular.com/

1

Понял ! (Принимая от ответа Майка):

/^(\D+)(?:_(\d+))?(?:\[([^\]]*)\])/ 

'some_param[name]' => ('some_param', None, 'name') 
'some_param_0[name]' => ('some_param', '0', 'name') 

(по крайней мере, в Python работает)

UPDATE: Немного больше я писал возился с ним, сделав результат чистки с помощью именованных групп:

^(?P<param>\D+)(?:_(?P<id>\d+))?(?:\[(?P<key>[^\]]*)\]) 

UPDATE:

  • Именованные группы не поддерживаются в JavaScript.
  • Я сделал несколько других упражнений с этим регулярным выражением.Все тесты можно найти здесь http://stuff.hackzine.org/stackoverflow/8497781_test-js-regex.html
  • Окончательное regexp Я вышел с: /^([A-Za-z_]+)(?:_(\d+))?(?:\[([^\]]*)\])?$/, который, кажется, работает во многих случаях.
+0

Прохладный! Будет проверять названные группы. – fenderplayer

+0

@fenderplayer, JavaScript не имеет названных групп. –

+0

Я тестирую именованные группы в javascript; похоже, что синтаксис отличается от синтаксиса Python; продолжайте настраиваться, поскольку я напишу здесь, когда узнаю, как их использовать в JS тоже .. :) – redShadow

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