如何替换字符串中除第一次出现之外的所有模式

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

快速问题:我的模式是一个 svg 字符串,它看起来像

l 5 0 l 0 10 l -5 0 l 0 -10
要与参考进行一些单元测试比较,我需要放弃除第一个之外的所有内容
l
我知道我可以放弃所有它们并在前面放置一个“l” ,或者我可以使用子字符串。但我想知道是否有一个 JavaScript 正则表达式习惯用法?

javascript regex regex-negation
6个回答
40
投票

您可以尝试否定前瞻,避免字符串的开头:

/(?!^)l/g

查看是否在线:jsfiddle


8
投票

没有 JS RegExp 可以替代除第一个模式匹配之外的所有内容。但是,您可以通过将函数作为第二个参数传递给

replace 
方法来实现此行为。

var regexp = /(foo bar )(red)/g; //Example
var string = "somethingfoo bar red  foo bar red red pink   foo bar red red";
var first = true;

//The arguments of the function are similar to $0 $1 $2 $3 etc
var fn_replaceBy = function(match, group1, group2){ //group in accordance with RE
    if (first) {
        first = false;
        return match;
    }
    // Else, deal with RegExp, for example:
    return group1 + group2.toUpperCase();
}
string = string.replace(regexp, fn_replaceBy);
//equals string = "something foo bar red  foo bar RED red pink   foo bar RED red"

每场比赛都会执行函数 (

fn_replaceBy
)。在第一次匹配时,函数立即返回匹配的字符串(什么也没发生),并设置一个标志。
其他所有匹配项将根据函数中描述的逻辑进行替换:通常,您使用
$0 $1 $2
等来引用组。在
fn_replaceBy
中,函数参数等于:第一个参数 =
$0
,第二个参数 =
$1
,等等。

匹配的子字符串将被函数

fn_replaceBy
的返回值替换。使用函数作为
replace
的第二个参数可以实现非常强大的应用程序,例如智能 HTML 解析器

另请参阅:MDN:String.replace > 将函数指定为参数


4
投票

这不是最漂亮的解决方案,但您可以用任意的东西(如占位符)和链替换来替换第一个出现的地方,以实现其余的逻辑:

'-98324792u4234jkdfhk.sj.dh-f01' // construct valid float
    .replace(/[^\d\.-]/g, '') // first, remove all characters that aren't common
    .replace(/(?!^)-/g, '') // replace negative characters that aren't in beginning
    .replace('.', '%FD%') // replace first occurrence of decimal point (placeholder)
    .replace(/\./g, '') // now replace all but first occurrence (refer to above)
    .replace(/%FD%(0+)?$/, '') // remove placeholder if not necessary at end of string
    .replace('%FD%', '.') // otherwise, replace placeholder with period

产品:

-983247924234.01

这只是扩展了任何寻找示例的人所接受的答案,该示例不能依赖于第一个匹配/出现是字符串中的第一个字符。


2
投票
 "l 5 0 l 0 10 l -5 0 l 0 -10".replace(/^\s+/, '').replace(/\s+l/g, '')

确保第一个

'l'
前面没有空格,并删除
'l'
后面的任何空格。


1
投票

我在https://www.regextester.com/99881找到了这个解决方案,使用了lookbehind模式:

/(?<=(.*l.*))l/g

或更笼统地说

/(?<=(.*MYSTRING.*))MYSTRING/g

其中

MYSTRING
是您要删除的内容。

(顺便说一句,这也可能是一个有用的字符串,用于删除电子邮件主题字符串中除第一次出现的“Re:”之外的所有内容。)


-1
投票

有这样的事吗?

"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/[^^]l/g, '')

© www.soinside.com 2019 - 2024. All rights reserved.