我对正则表达不太舒服,但需要扩展旧版本。 目前我们在我们的应用程序中使用此正则表达式:
const regex = /([a-zA-Z0-9_]+)(?:\[(.*?)\])?/g;
这允许我们像这样分割字符串:
hello[foo='bar']
进入:
hello and [foo='bar']
但是由于最近的更新,' hello' -part还可以包含名为' abc。'的前缀。结果将是abc.hello [foo =' bar']。但这是可选的。
使用当前正则表达式,我们将把它分成一个只包含[' abc',' abc',undefined]
的数组如果有人可以帮助我将这个可选前缀添加到当前正则表达中,我们将非常感激。
答案 0 :(得分:2)
您可以简单地将(abc\.)?
添加到正则表达式中,但我也会按照以下定义进行微调:
(abc\.)?(\w+)(\[[^\]]*\])?
(abc\.)?
可选择将abc.
捕获到捕获组1 (\w+)
将一个或多个单词字符捕获到捕获组2. \w
是[a-zA-Z0-9_]
(?:\[[^\]]*\])?
可选择将以下内容捕获到捕获组3中
\[
按字面意思匹配[
[^\]]*
匹配除]
以外的任何字符。这比使用.*?
更好,因为它不会回溯。这意味着更好的表现。\]
按字面意思匹配]
var a = ["abc.hello[foo='bar']", "hello[foo='bar']"]
var r = /(abc\.)?(\w+)(\[[^\]]*\])?/
a.forEach(function(s) {
console.log(s.match(r))
})
答案 1 :(得分:0)
只需将点添加到正则表达式中的第一个组即可:
([a-zA-Z0-9_.]+)(?:\[(.*?)\])?
那会分裂
abc.hello[foo='bar']
进入
abc.hello
和
foo='bar'
以及
hello[foo='bar']
到
hello
和
foo='bar'