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

发布于 2024-12-13 11:46:09 字数 188 浏览 0 评论 0原文

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

quick question: my pattern is an svg string and it looks like l 5 0 l 0 10 l -5 0 l 0 -10 To do some unittest comparison against a reference I need to ditch all but the first l I know i can ditch them all and put an 'l' upfront, or I can use substrings. But I'm wondering is there a javascript regexp idiom for this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

洒一地阳光 2024-12-20 11:46:09

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

/(?!^)l/g

查看是否在线: jsfiddle

You can try a negative lookahead, avoiding the start of the string:

/(?!^)l/g

See if online: jsfiddle

暗藏城府 2024-12-20 11:46:09

没有 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的返回值替换。使用函数作为替换的第二个参数可以实现非常强大的应用程序,例如智能 HTML 解析器

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

There's no JS RegExp to replace everything-but-the-first-pattern-match. You can, however, implement this behaviour by passing a function as a second argument to the replacemethod.

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"

The function (fn_replaceBy) is executed for each match. At the first match, the function immediately returns with the matched string (nothing happens), and a flag is set.
Every other match will be replaced according to the logic as described in the function: Normally, you use $0 $1 $2, et cetera, to refer back to groups. In fn_replaceBy, the function arguments equal these: First argument = $0, second argument = $1, et cetera.

The matched substring will be replaced by the return value of function fn_replaceBy. Using a function as a second parameter for replace allows very powerful applcations, such as an intelligent HTML parser.

See also: MDN: String.replace > Specifying a function as a parameter

情深如许 2024-12-20 11:46:09

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

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

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

It's not the prettiest solution, but you could replace the first occurrence with something arbitrary (like a placeholder) and chain replacements to fulfill the rest of the logic:

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

Produces:

-983247924234.01

This merely expands on the accepted answer for anyone looking for an example that can't depend on the first match/occurrence being the first character in the string.

清风夜微凉 2024-12-20 11:46:09
 "l 5 0 l 0 10 l -5 0 l 0 -10".replace(/^\s+/, '').replace(/\s+l/g, '')

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

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

makes sure the first 'l' is not preceded by space and removes any space followed by an 'l'.

若言繁花未落 2024-12-20 11:46:09

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

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

或者更一般地说

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

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

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

I found this solution at https://www.regextester.com/99881, using a lookbehind pattern:

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

Or more generally

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

where MYSTRING is something that you want to remove.

(This may also be a useful string for removing all but the first occurrence of "Re:" in an email subject string, by the way.)

甩你一脸翔 2024-12-20 11:46:09

像这样的东西吗?

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

Something like this?

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文