我有一个字符向量如下:
"sit", "situation", "situat", "lettuce", "situationabcd"
我想分配“坐”,“情境”和“情境”。事实上,我想将所有以“sit”开头但不以“abcd”结尾的字符串分组。
我试过"^(?!.*abcd$).*$"
但是这个子集也"lettuce"
。
答案 0 :(得分: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。
但实际上,如果您能够应用两个常规表达式,这是一个更好的解决方案,原因有两个:
首先,在所有正则表达式实现中,前瞻和后瞻都很昂贵(比其他实现更多但在所有情况下都很昂贵)。
...并且因为接近这种行为避免负面的后视将是困难的,我认为解决方案将是昂贵的(因为&#34; abcd&#34;字符位置可以重叠或不是最初的& #34; sit&#34; initial substring)。