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?
快速问题:我的模式是一个svg字符串,它看起来像l 5 0 l 0 10 l -5 0 l 0 -10要对参考进行一些单位测试比较我需要抛弃除了第一个l我知道我可以抛弃它们所有并预先设置'l',或者我可以使用子串。但我想知道这有一个javascript正则表达式成语吗?
5 个解决方案
#1
25
You can try a negative lookahead, avoiding the start of the string:
您可以尝试使用负向前瞻,避免字符串的开头:
/(?!^)l/g
See if online: jsfiddle
看看是否在线:jsfiddle
#2
7
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 replace
method.
没有JS RegExp来替换所有东西 - 但是第一个模式匹配。但是,您可以通过将函数作为第二个参数传递给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.
为每个匹配执行函数(fn_replaceBy)。在第一次匹配时,函数立即返回匹配的字符串(没有任何反应),并设置一个标志。每个其他匹配将根据函数中描述的逻辑进行替换:通常,您使用$ 0 $ 1 $ 2等等来引用组。在fn_replaceBy中,函数参数等于:第一个参数= $ 0,第二个参数= $ 1,等等。
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.
匹配的子字符串将被函数fn_replaceBy的返回值替换。使用函数作为替换的第二个参数允许非常强大的应用程序,例如智能HTML解析器。
See also: MDN: String.replace > Specifying a function as a parameter
另请参见:MDN:String.replace>将函数指定为参数
#3
2
"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'
.
确保第一个'l'前面没有空格,并删除任何空格后跟'l'。
#4
0
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
-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.
对于任何寻找不能依赖于第一个匹配/出现是字符串中第一个字符的示例的人来说,这仅仅扩展了所接受的答案。
#5
-1
Something like this?
像这样的东西?
"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/[^^]l/g, '')
“l 5 0 l 0 10 l -5 0 l 0 -10”.replace(/ [^^] l / g,'')
#1
25
You can try a negative lookahead, avoiding the start of the string:
您可以尝试使用负向前瞻,避免字符串的开头:
/(?!^)l/g
See if online: jsfiddle
看看是否在线:jsfiddle
#2
7
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 replace
method.
没有JS RegExp来替换所有东西 - 但是第一个模式匹配。但是,您可以通过将函数作为第二个参数传递给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.
为每个匹配执行函数(fn_replaceBy)。在第一次匹配时,函数立即返回匹配的字符串(没有任何反应),并设置一个标志。每个其他匹配将根据函数中描述的逻辑进行替换:通常,您使用$ 0 $ 1 $ 2等等来引用组。在fn_replaceBy中,函数参数等于:第一个参数= $ 0,第二个参数= $ 1,等等。
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.
匹配的子字符串将被函数fn_replaceBy的返回值替换。使用函数作为替换的第二个参数允许非常强大的应用程序,例如智能HTML解析器。
See also: MDN: String.replace > Specifying a function as a parameter
另请参见:MDN:String.replace>将函数指定为参数
#3
2
"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'
.
确保第一个'l'前面没有空格,并删除任何空格后跟'l'。
#4
0
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
-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.
对于任何寻找不能依赖于第一个匹配/出现是字符串中第一个字符的示例的人来说,这仅仅扩展了所接受的答案。
#5
-1
Something like this?
像这样的东西?
"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/[^^]l/g, '')
“l 5 0 l 0 10 l -5 0 l 0 -10”.replace(/ [^^] l / g,'')