Javascript JS Regex:删除单词后的任何内容(仅限)
我想删除每个单词后的所有符号(符号取决于我当时选择的内容),而不知道单词可能是什么。但是在每一个单词之前都要把它们放进去 举几个例子:Javascript JS Regex:删除单词后的任何内容(仅限),javascript,regex,Javascript,Regex,我想删除每个单词后的所有符号(符号取决于我当时选择的内容),而不知道单词可能是什么。但是在每一个单词之前都要把它们放进去 举几个例子: !!你好我的!!名称是鲍勃应该返回 !!你好,我的天!!名字是!!鲍勃;对于 及 $remove$在$a$word$之后的$targeted$@$$symbol$$$$$@仅$应返回 $仅在$word之后删除目标@$$symbol@$;对于$您需要使用捕获组并替换: "!!hello! my! !!name!!! is !!bob!!".re
!!你好我的!!名称是鲍勃代码>应该返回
!!你好,我的天!!名字是!!鲍勃
;对于代码>
及
$remove$在$a$word$
之后的$targeted$@$$symbol$$$$$@仅$应返回
$仅在$word之后删除目标@$$symbol@$;对于$
您需要使用捕获组并替换:
"!!hello! my! !!name!!! is !!bob!!".replace(/([a-zA-Z]+)(!+)/g, '$1');
这适用于您的测试字符串。要处理任何通用字符或字符组,请执行以下操作:
var stripTrailing = trail => {
let regex = new RegExp(`([a-zA-Z0-9]+)(${trail}+)`, 'g');
return str => str.replace(regex, '$1');
};
请注意,这在正则表达式中具有含义的任何字符上都会失败:[]{}+*^$。等等。以编程方式转义这些内容留给读者作为练习
更新
根据您的评论,我认为解释可能会对您有所帮助,因此:
首先,在这种情况下,无法仅替换匹配的一部分,您必须替换整个匹配。因此,我们需要找到一个匹配的模式,将其分为我们想要保留的部分和我们不想要的部分,并用我们想要保留的部分替换整个匹配。让我们把上面的正则表达式分成多行,看看发生了什么:
首先,我们要匹配任意数量的连续字母数字字符,这将是从中去除尾随符号的“单词”:
( // denotes capturing group for the 'word'
[ // [] means 'match any character listed inside brackets'
a-z // list of alpha character a-z
A-Z // same as above but capitalized
0-9 // list of digits 0 to 9
]+ // plus means one or more times
)
捕获组意味着我们只想访问比赛的那一部分。
然后我们有另一组
(
! // I used ES6's string interpolation to insert the arg here
+ // match that exclamation (or whatever) one or more times
)
然后我们添加g
标志,以便替换将针对目标字符串中的每个匹配发生,而不包含第一次匹配后返回的标志。JavaScript以自动插入符号的形式提供了访问捕获组的方便快捷方式,上面的“$1”表示“在此字符串中插入第一个捕获组的内容”
因此,在上面,如果您将“$1”替换为“$1$2”,您将看到以相同字符串开头的字符串,如果您使用“foo$2”,您将看到foo代替由一个或多个单词尾随的每个单词!,等等。你试过……什么?太好了,谢谢。你在哪里学的“正则表达式技巧”?想改进我的。主要是在这里,所以,你走在正确的轨道上。Zed Shaw的《艰苦学习正则表达式》是一个很好的资源。但是最好的办法是去一个像regex101这样的网站开始玩,因为它会给你一个关于regex的解释@Kreitzo在答案中添加了解释,“希望这对你有所帮助。这里不能也使用积极的lookaheads吗?@GGG我不这么认为,匹配后匹配单词将是一个lookback!”JS不能做“向后看”。我玩了它,但没有让它发挥作用,请随意发布另一个答案。