Javascript如何识别字母组合并去掉其中的一部分

Javascript如何识别字母组合并去掉其中的一部分,javascript,regex,reactjs,Javascript,Regex,Reactjs,我对Regex很陌生。现在我正在尝试使用正则表达式在将标记字符串发送到数据库之前准备它 下面是一个示例字符串: @[admin](user:3) Testing this string @[hellotessginal](user:4) Hey! 到目前为止,我能够使用/\[(.*)]\(.*):(\d+)/g来识别@[admin](用户:3)这里的整个术语 但下一步是,我希望删除(用户:3),留下@[admin] 因此,通过剥离器功能的结果将是: @[admin] Testing this

我对Regex很陌生。现在我正在尝试使用正则表达式在将标记字符串发送到数据库之前准备它

下面是一个示例字符串:

@[admin](user:3) Testing this string @[hellotessginal](user:4) Hey!
到目前为止,我能够使用
/\[(.*)]\(.*):(\d+)/g来识别
@[admin](用户:3)
这里的整个术语

但下一步是,我希望删除
(用户:3)
,留下
@[admin]

因此,通过剥离器功能的结果将是:

@[admin] Testing this string @[hellotessginal] Hey!
请帮忙

试试这个:

var str=“@[admin](用户:3)测试此字符串@[hellotessginal](用户:4)嘿!”;
str=str.replace(/*\([^)]*\)*/g';
console.log(str)您可以使用

s.replace(/(@\[[^\][]*])\([^()]*?:\d+\)/g, '$1')
详细信息

  • (@\[^\][*])
    -捕获组1:
    @[
    ,0个或更多的数字,而不是
    [
    ]
    尽可能多,然后
    ]
  • \(
    -a
    字符
  • [^()]*?
    -0个或更多(但尽可能少)字符,而不是
  • -冒号
  • \d+
    -1+位
  • \)
    -a
    字符
替换模式中的
$1
指的是组1中捕获的值

请参见JavaScript演示:

const rx=/(@\[^\][]*])\([^()]*?:\d+\)/g;
常量remove_parens=(string,regex)=>string.replace(regex,$1');
让s='@[admin](用户:3)测试这个字符串@[hellotessginal](用户:4)嘿!';
s=移除(s,rx);

控制台日志可以用空字符串替换以下正则表达式的匹配项

str.replace(/(?<=\@\[(.*?)\])\(.*?:\d+\)/g, ' ');
当然,为要用空字符串替换的子字符串创建捕获组毫无意义

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, ')'

(?为什么不捕获
\[(.*)]
呢?类似于
s.replace(/(\[.*)\(.*):\d+\)/g,$1')
可以。不过,我会在这里使用否定字符类而不是
s.replace(/(@\[\[\]*])\([^()*?:\d+\)/g,$1'))
s.replace能做什么?你能帮我写一个我可以修改的函数吗?@Mandy8055是的,但用户有可能在自己的妄想中键入,这就是为什么模式需要有一个条件才能有@[…]括号前面的
s
是一个字符串变量。嘿!谢谢你的回答。如果我没有错,这个正则表达式没有
@[…]的条件
在它前面,对吗?@Neowen舜,是的。它会删除括号内的所有内容。@Neowen舜看到了。@ShahnawazHossan对,问题是我只想删除它,如果它在
后面[…]
由于用户可能会在括号中键入一些消息,可能是我误解了您的问题。好的,我明白了。谢谢,这非常有效,但是我想问一下,如果我不使用它,为什么您要用“$1”@NeoWensun替换它,我将删除匹配的文本。但是,我们需要保留
@
和后续的
[…]
结果中的子字符串。这就是为什么它被捕获到一个组中(ID=1,捕获组是1索引的),并且使用了
$1
反向引用。@WiktorStribiżew,很好的解释。我也学到了一个新东西。向上投票。谢谢。
(?<=         : begin positive lookbehind
  \@\[       : match '@['
  (.*?)      : match 0+ chars, lazily, save to capture group 1
  \]         : match ']'
)            : end positive lookbehind
\(.*?:\d+\)  : match '(', 0+ chars, lazily, 1+ digits, ')'