繁体   English   中英

如何替换字符串中第一次出现的模式

[英]How to replace all BUT the first occurrence of a pattern in string

快速问题:我的模式是一个 svg 字符串,它看起来像l 5 0 l 0 10 l -5 0 l 0 -10要与参考进行一些单元测试比较,我需要放弃所有,但我知道我可以放弃第一个l all 并在前面放一个“l”,或者我可以使用子字符串。 但我想知道是否有一个 javascript regexp 成语?

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

/(?!^)l/g

在线查看: jsfiddle

没有 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的返回值fn_replaceBy 使用函数作为replace的第二个参数允许非常强大的应用程序,例如智能 HTML 解析器

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

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

'-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

对于任何寻找不能依赖于第一个匹配/出现是字符串中的第一个字符的示例的人来说,这只是扩展了公认的答案。

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

确保第一个'l'前面没有空格,并删除后跟'l'任何空格。

标记的分析服务程序实质上是错误的,第一次出现并不意味着字符串以该模式开头。

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

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

或更一般地

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

其中MYSTRING是您要删除的内容。

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

像这样的东西?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM