Javascript如何识别字母组合并去除其中的一部分
Posted
技术标签:
【中文标题】Javascript如何识别字母组合并去除其中的一部分【英文标题】:Javascript how to identify a combination of letters and strip a portion of it 【发布时间】:2020-10-25 20:45:52 【问题描述】:我对 Regex 很陌生。现在我尝试使用正则表达式来准备我的标记字符串,然后再将其发送到数据库。
这是一个示例字符串:
@[admin](user:3) Testing this string @[hellotessginal](user:4) Hey!
到目前为止,我能够在此处使用 /@\[(.*?)]\((.*?):(\d+)\)/g
识别整个术语 @[admin](user:3)
但下一步是我希望删除(user:3)
留下@[admin]
。
因此,通过剥离器函数的结果将是:
@[admin] Testing this string @[hellotessginal] Hey!
请帮忙!
【问题讨论】:
那你为什么不捕获@\[(.*?)]
呢?像s.replace(/(@\[.*?])\(.*?:\d+\)/g, '$1')
这样的东西可以做到。不过,我会在这里使用否定字符类而不是 .
,s.replace(/(@\[[^\][]*])\([^()]*?:\d+\)/g, '$1')
我很抱歉成为菜鸟@WiktorStribiżew,s.replace 有什么作用?你能写一个我可以修改的函数来帮助我理解吗?
@Mandy8055 是的,但是用户有可能输入自己的括号,这就是为什么模式需要有一个条件才能在括号前面加上 @[...]
s
是一个字符串变量。
【参考方案1】:
你可以使用
s.replace(/(@\[[^\][]*])\([^()]*?:\d+\)/g, '$1')
请参阅 regex demo。 详情:
(@\[[^\][]*])
- 捕获组 1:@[
,除 [
和 ]
之外的 0 个或多个数字尽可能多,然后是 ]
\(
- 一个 (
字符
[^()]*?
- 除了 (
和 )
之外的 0 个或更多(但尽可能少)字符
:
- 冒号
\d+
- 1 位以上
\)
- 一个 )
字符。
替换模式中的$1
指的是在第 1 组中捕获的值。
查看 javascript 演示:
const rx = /(@\[[^\][]*])\([^()]*?:\d+\)/g;
const remove_parens = (string, regex) => string.replace(regex, '$1');
let s = '@[admin](user:3) Testing this string @[hellotessginal](user:4) Hey!';
s = remove_parens(s, rx);
console.log(s);
【讨论】:
感谢这个完美的作品,但是我可以问你为什么用'$1'替换 @neowenshun 如果我不使用它,我将删除匹配的文本。但是,我们需要在结果中保留@
和后续的[...]
子字符串。这就是为什么它被捕获到一个组中(ID=1,捕获组是 1-indexed),并使用 $1
反向引用。
@WiktorStribiżew,很好的解释。我也学到了新东西。赞成。谢谢。【参考方案2】:
试试这个:
var str = "@[admin](user:3) Testing this string @[hellotessginal](user:4) Hey!";
str = str.replace(/ *\([^)]*\) */g, ' ');
console.log(str);
【讨论】:
嘿!感谢回复。如果我没有错,这个正则表达式不具备@[...]
在它前面的条件,对吗?
@neowenshun,是的。它将删除括号内的所有内容。
@neowenshun 见this regex demo。
@ShahnawazHossan 对,问题是我只希望在 @[...]
之后删除它,因为用户可能会在括号中输入一些消息
可能是我误解了你的问题。好的,明白了。【参考方案3】:
您可以将以下正则表达式的匹配项替换为空字符串。
str.replace(/(?<=\@\[(.*?)\])\(.*?:\d+\)/g, ' ');
regex demo
我假设示例中"admin"
和"user"
作为占位符的字符串不能包含字符串"()[]"
中的字符。如果不是这种情况,请发表评论,我会调整正则表达式。
我保留了第一个捕获组,假设它是用于某些未说明的目的。如果不需要,请将其删除:
(?<=\@\[.*?\])\(.*?:\d+\)
当然没有必要为要替换为空字符串的子字符串创建捕获组。
Javascript 的正则表达式引擎执行以下操作。
(?<= : begin positive lookbehind
\@\[ : match '@['
(.*?) : match 0+ chars, lazily, save to capture group 1
\] : match ']'
) : end positive lookbehind
\(.*?:\d+\) : match '(', 0+ chars, lazily, 1+ digits, ')'
【讨论】:
以上是关于Javascript如何识别字母组合并去除其中的一部分的主要内容,如果未能解决你的问题,请参考以下文章
如何组合 pandas df 以便可以合并具有置换 col1 和 col2 值的行,其中仅包含一个组合并汇总计数列