匹配两个特殊字符之间的子字符串,不包括字符

Posted

技术标签:

【中文标题】匹配两个特殊字符之间的子字符串,不包括字符【英文标题】:Matching a substring between two special characters EXCLUDING the characters 【发布时间】:2019-11-20 15:07:13 【问题描述】:

所以我想使用正则表达式来捕获 javascript 中两个特殊字符之间的子字符串。 假设我有字符串"$Hello$, my name is $John$",我希望.match 返回[Hello, John] 的数组。 *另外,我不想捕捉两场比赛之间的比赛。所以我不想捕获 $,我的名字是 $,因为它在技术上介于两个 '$' 之间。

我使用的正则表达式是

var test = str.match(/(?<=\$)(.*)(?=\$)/);

这有效,但每个条目重复两次。所以它有 [你好,你好,约翰,约翰]。 我也用过var test = str.match(/(?&lt;=\$)[^\$]+?(?=\$)/g) 但这会返回每场比赛之间的所有内容(我上面列出的示例 $,我的名字是 $。)

我该如何解决这个问题?

【问题讨论】:

请注意,lookbehinds 是 not yet well-supported。 "$Hello$, my name is $John$".split("$").filter((el, i ) =&gt; i % 2) 输出["Hello", "John"] 【参考方案1】:

您可以匹配第一个和第二个美元符号,并使用捕获组来捕获介于两者之间的字符,使用与除美元符号之外的任何字符匹配的否定字符类。

\$([^$]+)\$

Regex demo

您可以使用exec,而不是使用匹配。例如:

var str = "$Hello$, my name is $John$";
var regex = /\$([^$]+)\$/g;
var m;
var test = [];

while ((m = regex.exec(str)) !== null) 
  // This is necessary to avoid infinite loops with zero-width matches
  if (m.index === regex.lastIndex) 
    regex.lastIndex++;
  
  test.push(m[1]);


console.log(test);

【讨论】:

这正是我们所需要的,非常感谢!【参考方案2】:

我能够通过/(?&lt;=\$)[^$ ]+(?=\$)/g 获得所需的匹配项。

它将匹配两个美元符号之间的每个单词,但它依赖于两个假设。首先是$不能作为字符出现在句子中,例如$Your$ total is $4.50, cash or $card$。第二个是美元符号内永远不会有空格,例如$Hello$, my name is $John Smith$。只要可行,您就可以开始了。

【讨论】:

【参考方案3】:

无需使用lookbehinds即可实现:

(?:.*?\$(.*?)\$) /g

我所做的只是懒洋洋地寻找$,然后懒洋洋地捕获所有东西,直到遇到下一个$。这通过/g 标志重复多次。然后每个捕获组将具有所需的字符串。

Demo

【讨论】:

以上是关于匹配两个特殊字符之间的子字符串,不包括字符的主要内容,如果未能解决你的问题,请参考以下文章

Linux通配符与特殊符号知识大全汇总

Linux通配符与特殊符号知识大全汇总

Linux通配符与特殊符号知识大全

正则表达式

正则表达式

bzoj4641基因改造 特殊匹配条件的KMP