带有可选前缀的正则表达式

时间:2018-03-12 14:08:12

标签: javascript regex

我对正则表达不太舒服,但需要扩展旧版本。 目前我们在我们的应用程序中使用此正则表达式:

const regex = /([a-zA-Z0-9_]+)(?:\[(.*?)\])?/g;

这允许我们像这样分割字符串:

hello[foo='bar']

进入:

hello and [foo='bar']

但是由于最近的更新,' hello' -part还可以包含名为' abc。'的前缀。结果将是abc.hello [foo =' bar']。但这是可选的。

使用当前正则表达式,我们将把它分成一个只包含[' abc',' abc',undefined]

的数组

如果有人可以帮助我将这个可选前缀添加到当前正则表达中,我们将非常感激。

2 个答案:

答案 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'