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



我有一个字符向量如下:

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

我想子集"坐","情况"和"位置"。事实上,我想对所有以"sit"开头的字符串进行子集化,而不是以"abcd"结尾的字符串。

我尝试了"^(?!.*abcd$).*$"
但这个子集也"lettuce"

您可以通过对字符串结尾对象 ($) 使用负回溯来接近它。

这里有一个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"字符位置可以重叠或不与初始"sit"初始子字符串重叠)。

最新更新