我想找到$ctrl.
和正则表达式之后的属性,我用来做这个:/\$ctrl\.(\w+)(?:\.\w+)?/g
.
这个正则表达式不够好,因为对于这个输入:
const str =
'$ctrl.bla $ctrl.bar.foo $ctrl.bla{{index}}.foo $ctrl.1bla $ctrl.invalid.prop{{index}}';
它匹配:
$ctrl.bla <--- good.
$ctrl.bar.foo. <-- not good. should find the `bar` because it's the word after $ctrl.
$ctrl.bla <--- goood
$ctrl.1bla. <-- invalid property syntax because it has number.
$ctrl.invalid.prop <-- should match the invalid word not matter that prop end with {{.
如何更改正则表达式以匹配有效的属性语法?
const regex = /\$ctrl\.(\w+)(?:\.\w+)?/g;
const str =
'$ctrl.bla $ctrl.bar.foo $ctrl.bla{{index}}.foo $ctrl.1bla $ctrl.invalid.prop{{index}}';
let match;
while ((match = regex.exec(str)) != null) {
console.log(match[0]);
}
1条答案
按热度按时间dw1jzc5e1#
正如前面在评论中发布的,您可以使用正则表达式只匹配字母(
a-zA-Z
只使prop不区分大小写),并使用lookahead/lookbehind只匹配您需要的内容。我的解决方案:
Regex解释说:
(?<=\$ctrl\.)
:这是一个正向后查找,因为我只需要匹配$ctrl
后面的属性,而不需要实际匹配它[a-zA-Z]+
:仅匹配从a
到z
的字母,不区分大小写(+
至少匹配其中一个)(?=\s|\.|$)
:这是一个正向前看,我用它来Assert,如果我匹配一个prop,那么实际的字符串将在它之后结束,要么是空格(\s
),要么是点(\.
),要么是因为字符串结束($
)通过使用lookbehind和lookahead,我们可以确保只匹配我们需要的(在本例中只匹配 prop 名)