javascript 如何在js中使用regex匹配$ctrl.之后的有效属性访问?

zwghvu4y  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(94)

我想找到$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]);
}

stackblitz.com

dw1jzc5e

dw1jzc5e1#

正如前面在评论中发布的,您可以使用正则表达式只匹配字母(a-zA-Z只使prop不区分大小写),并使用lookahead/lookbehind只匹配您需要的内容。
我的解决方案:

const regex = /(?<=\$ctrl\.)[a-zA-Z]+(?=\s|\.|$)/g

console.log('$ctrl.bla $ctrl.bar.foo $ctrl.bla{{index}}.foo $ctrl.1bla $ctrl.invalid.prop{{index}}'.match(regex))
// Output: ['bla', 'bar', 'invalid']

Regex解释说:

  • (?<=\$ctrl\.):这是一个正向后查找,因为我只需要匹配$ctrl后面的属性,而不需要实际匹配它
  • [a-zA-Z]+:仅匹配从az的字母,不区分大小写(+至少匹配其中一个)
  • (?=\s|\.|$):这是一个正向前看,我用它来Assert,如果我匹配一个prop,那么实际的字符串将在它之后结束,要么是空格(\s),要么是点(\.),要么是因为字符串结束($

通过使用lookbehind和lookahead,我们可以确保只匹配我们需要的(在本例中只匹配 prop 名)

相关问题