快速问题:我的模式是一个 svg 字符串,它看起来像
l 5 0 l 0 10 l -5 0 l 0 -10
要与参考进行一些单元测试比较,我需要放弃除第一个之外的所有内容 l
我知道我可以放弃所有它们并在前面放置一个“l” ,或者我可以使用子字符串。但我想知道是否有一个 JavaScript 正则表达式习惯用法?
没有 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 解析器。
这不是最漂亮的解决方案,但您可以用任意的东西(如占位符)和链替换来替换第一个出现的地方,以实现其余的逻辑:
'-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找到了这个解决方案,使用了lookbehind模式:
/(?<=(.*l.*))l/g
或更笼统地说
/(?<=(.*MYSTRING.*))MYSTRING/g
其中
MYSTRING
是您要删除的内容。
(顺便说一句,这也可能是一个有用的字符串,用于删除电子邮件主题字符串中除第一次出现的“Re:”之外的所有内容。)
有这样的事吗?
"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/[^^]l/g, '')