我有以下字符串集:
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"
正确的正则表达式是什么?
答案 0 :(得分: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"]
答案 1 :(得分:1)
知道了! (摘自Mike的回答):
/^(\D+)(?:_(\d+))?(?:\[([^\]]*)\])/
'some_param[name]' => ('some_param', None, 'name')
'some_param_0[name]' => ('some_param', '0', 'name')
(至少在Python中它起作用)
更新:通过使用命名组使结果更清晰,我写了一些额外的东西:
^(?P<param>\D+)(?:_(?P<id>\d+))?(?:\[(?P<key>[^\]]*)\])
<强>更新强>
/^([A-Za-z_]+)(?:_(\d+))?(?:\[([^\]]*)\])?$/
,这似乎适用于很多情况。答案 2 :(得分:0)
请检查以下正则表达式“(\ w +)_(\ d)[(\ w +)]”你可以测试它@ http://rubular.com/