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如何识别字母组合并去除其中的一部分的主要内容,如果未能解决你的问题,请参考以下文章

JAVA,用List做,两个数组中数的合并和去除相同元素

如何实现 2048 的合并功能

如何组合 pandas df 以便可以合并具有置换 col1 和 col2 值的行,其中仅包含一个组合并汇总计数列

基于SVM的字母验证码识别

整合去除HTML 标签, 去除开头结尾换行,将连续空格合并为一个

需要去除字母的 CSV 列号数据 - Pandas