匹配字符串以短语开头但不以另一个短语结尾

问题描述 投票:0回答:1

我有一个字符向量如下:

"sit", "situation", "situat", "lettuce", "situationabcd"

我想分配“坐”,“情境”和“情境”。事实上,我想将所有以“sit”开头的字符串分组,而不是以“abcd”结尾的字符串。

我试过"^(?!.*abcd$).*$" 但是这个也是"lettuce"的子集。

regex
1个回答
1
投票

你可以通过对字符串结尾对象($)使用负向lookbehind来接近它。

这是Javascript中的一个例子:

var str = [ "sit", "situation", "situat", "lettuce", "situationabcd" ];

var expr = /^sit.*?$(?<!abcd)/;

console.log (str.filter(x=>x.match(expr)));
// Outputs: [ 'sit', 'situation', 'situat' ]

编辑:

这里预先ES2018的javascript解决方案:

var str = [ "sit", "situation", "situat", "lettuce", "situationabcd" ];

console.log (
    str
        .filter(x=>x.match(/^sit/))
        .filter(x=>!x.match(/abcd$/))
);
// Outputs: [ 'sit', 'situation', 'situat' ]

事实上,这是我想要提供的原始解决方案,但我拒绝主要是因为原始问题要求单个正则表达式,并且不说是否可以通过多个和/或任何编程语言甚至javascript来处理。

但是,实际上,如果您能够应用两个常规表达式,这是一个更好的解决方案,原因有两个:

  • 首先,在所有正则表达式实现中,前瞻和后瞻都很昂贵(比其他实现更多但在所有情况下都很昂贵)。
  • ...并且因为接近这种行为避免负面的后视将是困难的并且我发现解决方案将是昂贵的(因为“abcd”字符位置可以重叠或不与最初的“坐”初始子串)。
© www.soinside.com 2019 - 2024. All rights reserved.