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

时间:2011-10-31 21:29:36

标签: javascript regex regex-negation

快速问题:我的模式是一个svg字符串,它看起来像l 5 0 l 0 10 l -5 0 l 0 -10要对参考进行一些单位测试比较我需要抛弃除了第一个l以外我知道我可以抛弃它们先放一个'l',或者我可以使用子串。但我想知道这有一个javascript正则表达式成语吗?

7 个答案:

答案 0 :(得分:30)

您可以尝试使用负向前瞻,避免字符串的开头:

/(?!^)l/g

查看是否在线:jsfiddle

答案 1 :(得分:7)

没有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的第二个参数可以实现非常强大的应用程序,例如intelligent HTML parser

另请参阅:MDN: String.replace > Specifying a function as a parameter

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

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

对于任何寻找不能依赖于第一个匹配/出现的字符串中的第一个字符的例子,这只会扩展到接受的答案。

答案 4 :(得分:0)

标记的分析器实质上是错误的,第一次出现并不表示字符串以该模式开头。

答案 5 :(得分:-1)

这样的东西?

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

答案 6 :(得分:-1)

我在https://www.regextester.com/99881处使用了一种后向模式找到了该解决方案:

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

或更笼统

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

其中MYSTRING是您要删除的东西。

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