匹配两个特殊字符之间的子字符串,不包括字符
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(/(?<=\$)[^\$]+?(?=\$)/g)
但这会返回每场比赛之间的所有内容(我上面列出的示例 $,我的名字是 $。)
我该如何解决这个问题?
【问题讨论】:
请注意,lookbehinds 是 not yet well-supported。"$Hello$, my name is $John$".split("$").filter((el, i ) => 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】:我能够通过/(?<=\$)[^$ ]+(?=\$)/g
获得所需的匹配项。
它将匹配两个美元符号之间的每个单词,但它依赖于两个假设。首先是$
不能作为字符出现在句子中,例如$Your$ total is $4.50, cash or $card$
。第二个是美元符号内永远不会有空格,例如$Hello$, my name is $John Smith$
。只要可行,您就可以开始了。
【讨论】:
【参考方案3】:无需使用lookbehinds即可实现:
(?:.*?\$(.*?)\$) /g
我所做的只是懒洋洋地寻找$
,然后懒洋洋地捕获所有东西,直到遇到下一个$
。这通过/g
标志重复多次。然后每个捕获组将具有所需的字符串。
Demo
【讨论】:
以上是关于匹配两个特殊字符之间的子字符串,不包括字符的主要内容,如果未能解决你的问题,请参考以下文章