捕获一组两个特殊字符之间的所有内容,但允许角色在正文中出现一次

Capture everything between a group of two special characters, but allow the character to appear once in the body

本文关键字:角色 许角色 一次 正文 一组 两个 特殊字符 之间      更新时间:2023-09-26

我想捕捉##组之间的一切。在下面的文字"这是##示例##我正在##当前##测试"中,我想得到以下匹配:examplecurrently。我把它缩小到这个规则:/##([^'#]+)##/g.该规则有两个缺点:

  1. 它返回"自定义边界"(即 ##example##,而不是example)和
  2. 当"匹配"中只有一个#时,它不起作用(即 ##ex#ample##)。

我需要更改什么才能使其按预期工作?

只需匹配标记之间的任何字符,并通过在量词+后添加?使其不贪婪:

/##(.+?)##/g
匹配

的结果是第一项中的整个匹配,然后是所有匹配的组。由于模式中有一个组,因此索引 1 处的标记之间将包含内容,即 match[1]

var text = "this is the ##exa#mple## I am ##currently## testing on";
var re = /##(.+?)##/g;
var match;
while ((match = re.exec(text)) != null) {
  // show match in the Stackoverflow snippet
  document.write(match[1] + '<br>');
}

注意:模式中的.匹配任何非换行符。您也可以改用['W'w]来允许换行。

只需像下面这样更改您的正则表达式,然后从组索引 1 中获取您想要的字符串。

##((?:(?!##).)+)##

(?:(?!##).)+匹配任何字符,但不会匹配##一次或多次。

演示

> var s = "this is the ##exa#mple## I am ##current## testing on"
> var re = /##((?:(?!##).)+)##/g;
undefined
> var m;
undefined
> while ((m = re.exec(s)) != null) {
... console.log(m[1]);
... }
exa#mple
current

对于你的第一个缺陷,你需要一个捕获组,它只捕获你的需求,如##([^#]*)## 对于你的第二个缺陷,你需要让你的正则表达式不贪婪,如##([^#]*?##现在打印组(1)