包含可选子字符串的正确正则表达式匹配

Correct Regular Expression match containing optional substrings

本文关键字:正则表达式 字符串 包含可      更新时间:2023-09-26

我有以下一组字符串:

some_param[name] 
some_param_0[name]

我想捕捉 some_param , 0 , 名称。我的正则表达式知识相当薄弱。我尝试了以下方法,但它并不适用于两种情况。

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

正确的正则表达式是什么?

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

('w+?)使用非贪婪量词捕获标识符部分,而不包含任何尾随的_

_?是贪婪的,所以会在前面的部分打败+?

('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"]

明白了!(取自Mike的回答):

/^('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>[^']]*)'])

更新:

    JavaScript不支持命名组。我对这个正则表达式做了一些其他的修改。所有的测试都可以在这里找到http://stuff.hackzine.org/stackoverflow/8497781_test-js-regex.html
  • 我得出的最终regexp是:/^([A-Za-z_]+)(?:_('d+))?(?:'[([^']]*)'])?$/,这似乎在很多情况下都有效。

请检查下面的regexp "('w+)_('d)[('w+)]"您可以测试它@ http://rubular.com/