我遇到了一个小问题,需要用正则表达式匹配所有以给定前缀开头的子字符串。这个操作是在javascript中完成的。
prefix = "pre-"
regex = /???/
"pre-foo-bar bar pre-bar barfoo".replace(regex, '')
// should output "bar barfoo"
我遇到了一个小问题,需要用正则表达式匹配所有以给定前缀开头的子字符串。这个操作是在javascript中完成的。
prefix = "pre-"
regex = /???/
"pre-foo-bar bar pre-bar barfoo".replace(regex, '')
// should output "bar barfoo"
/(\s|^)pre-\S*(\s)?/g
/\bpre-\S*/g
更正
\b
只查找单词字符,而-
绝对不是单词字符。不幸的是,JavaScript不支持自定义后顾。
/(\s|^)pre-\S*/g
应该可以工作,但与上面给出的示例输出相比,会有一个前导空格。这将检查"pre-"前面没有任何内容或空格字符,后跟0个或多个非空格字符。它会删除整个块,但保留空格。如果空格对您来说真的很重要,可以使用:/(\s|^)pre-\S*(\s)?/g
str.replace(/(\s|^)pre-\S*\s?/g, function(wholeString, optionalSpaceCharacter) {
return optionalSpaceCharacter;
});
第二次更正
我给你的复杂替换在连续两个"pre-"出现时不起作用,例如"pre-a pre-b pre-c"。由于末尾的\s?
,你最终会得到"pre-b "
。为了获得精确的输出,你最好使用/(\s|^)pre-\S*/g
,并检查原始字符串是否以"pre-"开头,如果是,则只需从开头删除一个空格。
str.replace(/(\s|^)pre-\S*/g, '').substring(str.substring(0, 4) == "pre-" ? 1 : 0);
var str = 'pre-foo-bar f-pre-foo-bar bar pre-pre pre-bar barfoopre- pre-a pre-b pre-c';
str = str.replace(/(^|\s+)pre-\S*(?=\s+|$)/g, '$1');
document.write('<pre>' + str + '</pre>');
我们寻找以空格或字符串开头(^|\s)
的字符串,必须以pre-
开头,并且我们获取所有非空格字符,后跟一个或多个空格或字符串结尾\S*(?=\s+|$)
。我们删除除初始空格/字符串开头$1
(引用(^|\s)
)之外的所有内容。pre-foo-bar
转换为 foo-bar
。问题要求完全删除它。 - Brian Nickel"pre-a pre-b pre-c"
会失败,因为你在末尾寻找额外的空格。 - Brian Nickel使用这个
var string = 'pre-foo-bar bar pre-bar barfoo';
string.replace(/pre-[\w\S]+/ig,'');
foo-pre-bar
转换为 foo-bar
。问题只想要删除前缀单词。请参见所需的输出。 - Brian Nickel
f-pre-foo-bar bar pre-bar barfoo
上使用 :-) 现在 f- 是前缀。 - xanatos