regex 当我有多个匹配项时,为什么在括号之间查找匹配错误?

unftdfkk  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(131)

我试图找到两个括号之间的文本并将它们放入数组中。
为此,我使用以下正则表达式:/\{\{([^)]+)\}\}/。(它匹配两个括号中的文本)。
但是当我有多个匹配时,它就会把匹配做错。
为什么?是因为正则表达式不正确,还是我需要使用一些正则表达式标志?
我希望得到一个由foobar组成的数组。

const a = 'text:{{ foo }} {{bar}}';
const b = a.match(/\{\{([^)]+)\}\}/);
console.log(b);

我的最终目标是将这段文字text:{{ foo }} {{bar}}'text:' + foo + bar。这意味着我想去掉括号,用引号把不是括号的东西包起来,然后用加号和它们联系。
要做到这一点,我想找到foobar,然后分裂的结果文本和联系他们。

wwwo4jvm

wwwo4jvm1#

我曾经做过一个任务,它需要我使用像你的正则表达式来查找和替换括号之间的文本,我写了一个单行函数来完成这个任务,我把它贴出来作为将来参考的答案

/**
 * @param str - The string to parse
 * @param conf - The object to get "variables" from (eg: { name: 'John' } would be the object if the string was 'Hello {{name}}')
 */
const parse = (str, conf) => str.replace(/{{(?<sc>[a-z]+)}}/g, (substr, match) => conf[match] ?? substr);

在您的情况下,您可以使用类似这样的内容:

const a = 'text:{{ foo }} {{bar}}'
const b = a.match(/(?<=\{\{\s*)\w+(?=\s*\}\})/g)
console.log(b) // output: ['foo', 'bar']

说明:

  • (?<=\{\{\s*):这是一个正向后查找,它Assert匹配前面是括号中的正则表达式,在本例中,我查找{{,后面是0个或更多空格
  • \w+:匹配任意单词字符(foobar
  • (?=\s*\}\}):这与第一个组的操作相同,但它Assert匹配是**,**后面是括号之间的匹配,在本例中,我查找0个或更多空格,然后查找}}
  • g:是全局修饰符,我添加它是因为我想匹配这个正则表达式的所有示例,并且在第一次匹配后不停止

相关问题