匹配以特定前缀开头的子字符串

3

我遇到了一个小问题,需要用正则表达式匹配所有以给定前缀开头的子字符串。这个操作是在javascript中完成的。

prefix = "pre-"
regex = /???/

"pre-foo-bar bar pre-bar barfoo".replace(regex, '')
// should output "bar barfoo"
3个回答

3
/(\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);

尝试在 f-pre-foo-bar bar pre-bar barfoo 上使用 :-) 现在 f- 是前缀。 - xanatos
当然,\b不匹配“-”,这是唯一真正支持的反向预查。 这使得事情有点丑陋。 - Brian Nickel
谢谢,我并不介意额外的空格,所以这对我来说没问题。 - Pierre

1
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>');

http://jsfiddle.net/qTADZ/5/

我们寻找以空格或字符串开头(^|\s)的字符串,必须以pre-开头,并且我们获取所有非空格字符,后跟一个或多个空格或字符串结尾\S*(?=\s+|$)。我们删除除初始空格/字符串开头$1(引用(^|\s))之外的所有内容。

这将把 pre-foo-bar 转换为 foo-bar。问题要求完全删除它。 - Brian Nickel
我们遇到了完全相同的问题 :-). "pre-a pre-b pre-c" 会失败,因为你在末尾寻找额外的空格。 - Brian Nickel
@BrianNickel 已解决... 但我并不是很满意,因为它会在字符串的开头或结尾留下空格。 - xanatos

1

使用这个

var string = 'pre-foo-bar bar pre-bar barfoo';  
string.replace(/pre-[\w\S]+/ig,'');

这将把 foo-pre-bar 转换为 foo-bar。问题只想要删除前缀单词。请参见所需的输出。 - Brian Nickel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接