【问题标题】:Match only @ and not @@ without negative lookbehind只匹配 @ 而不是 @@ 没有负面的后视
【发布时间】:2018-09-20 03:56:06
【问题描述】:

使用 JavaScript,我需要一个匹配任何字符串中任何 @{this-format} 实例的正则表达式。我原来的正则表达式如下:

@{[a-z-]*}

但是,我还需要一种“逃避”这些实例的方法。我想要这样,如果你添加一个额外的@,匹配就会被转义,比如@@{this}。

我最初使用了否定的lookbehind:

(?<!@)@{[a-z-]*}

这会很好用,除了...lookbehinds 是 ECMAScript2018 的一项功能,仅受 Chrome 支持。

我读到一些人建议使用否定字符集。所以我的小正则表达式变成了这样:

(?:^|[^@])@{[a-z-]*}

...本来也可以,但如果将其中两个放在一起就行不通了:@{foo}@{bar​​}

那么,有谁知道我怎样才能做到这一点?请记住,需要满足这些条件:

  • 在字符串中的任意位置查找@{this}
  • 能够像@@{this}一样逃跑
  • 能够将多个相邻,如@{these}@{two}
  • 不得使用 Lookbehinds

【问题讨论】:

  • 澄清一下...它不适用于@{foo}@{bar} 的输入,因为它只能找到一个匹配项,而不是2 个匹配项(一个用于@{foo},一个用于@{bar}) ?

标签: javascript regex regex-lookarounds


【解决方案1】:

如果您在正则表达式模式中包含@@ 作为备用匹配选项,它将使用@@,而不是允许在随后的括号实体上进行匹配。像这样:

@@|(@{[a-z-]*})

然后您可以在 javascript 中评估内部匹配对象。 Here is a jsfiddle进行演示,使用如下代码。

var targetText = '@{foo} in a @{bar} for a @@{foo} and @{foo}@{bar} things.'
var reg = /@@|(@{[a-z-]*})/g;
var result;
while((result = reg.exec(targetText)) !== null) {
        if (result[1] !== undefined) {
        alert(result[1]);
    }
}

【讨论】:

  • 谢谢,这是一个很好的解决方案,我会用这个。不过只有一件事,如果我输入@@@{text},它会将其视为两个单独的匹配项,@@@{text}。不过很容易解决,只需在第二个 @ 之后添加一个 +,如 /@@+|(@{[a-z-]*})/g
【解决方案2】:

您可以使用(?:^|[^@])@ 来匹配模式的开头,并在一个组中捕获以下@{&lt;sometext&gt;}。由于您不希望初始(可能)[^@] 出现在结果中,因此您必须手动迭代匹配项并提取包含所需子字符串的组。例如:

function test(str) {
  const re = /(?=(?:^|[^@])(@{[a-z-]*}))./g;
  let match;
  const matches = [];
  while (match = re.exec(str)) {
    matches.push(match[1]); // extract the captured group
  }
  return matches;
}
console.log(test('@@{this}'))
console.log(test('@{these}@{two}'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多