包含可选子字符串的正确正则表达式匹配
Correct Regular Expression match containing optional substrings
我有以下一组字符串:
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/
相关文章:
- 将电子邮件验证正则表达式字符串存储在JSON中
- 带有模式的正则表达式字符串
- Javascript if数组包含正则表达式字符串
- 在JSON中指定正则表达式字符串,在JavaScript和PHP中使用
- 从正则表达式文本中获取正则表达式字符串表示的最佳方式
- 正则表达式 - 字符串不能以空格开头,以空格结尾,并且连续包含几个空格
- 正则表达式 - 字符串不应包含超过 7 位数字
- 在 javascript 中将正则表达式字符串转换为正则表达式不同
- Javascript:测试单个字符在正则表达式字符串中找到
- 正则表达式(字符串比较)
- 是否可以生成与正则表达式字符串匹配的字符串
- 正则表达式字符串匹配
- 正则表达式字符串比较忽略符号
- 是否可以使用正则表达式解析正则表达式字符串
- 正则表达式字符串在文档中替换为 JavaScript
- 如何使正则表达式字符串拒绝空白字段
- 拆分正则表达式字符串
- 表示正则表达式字符串表示法
- 将HTML标记添加到此正则表达式字符串中
- 将正则表达式字符串转换为javascript中的正则表达式对象