在两个特殊字符之间匹配子字符串

时间:2019-07-10 23:55:23

标签: javascript regex reactjs

因此,我想使用正则表达式捕获JavaScript中两个特殊字符之间的子字符串。 假设我有字符串"$Hello$, my name is $John$",我希望.match返回[Hello, John]的数组。 *此外,我不想捕获两个匹配项之间的匹配项。因此,我不想捕获$,我的名字是$,因为从技术上讲,它在两个$之间。

我使用的正则表达式是

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

可以,但是将每个条目重复两次。所以它有 [你好,你好,约翰,约翰]。 我也用过var test = str.match(/(?<=\$)[^\$]+?(?=\$)/g) 但这会返回每个匹配项之间的所有内容(我在$上方列出的示例,我的名字是$。)

我该如何解决?

3 个答案:

答案 0 :(得分:2)

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

\$([^$]+)\$

Regex demo

您可以使用exec而不是使用match。例如:

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);

答案 1 :(得分:1)

我能够通过/(?<=\$)[^$ ]+(?=\$)/g获得想要的比赛。

它将匹配两个美元符号之间的每个单词,但是它依赖于两个假设。首先是$不能作为字符出现在句子中,例如$Your$ total is $4.50, cash or $card$。第二个是美元符号内绝不会有空格,例如$Hello$, my name is $John Smith$。只要这行得通,那就应该很好。

答案 2 :(得分:0)

无需使用后退即可实现:

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

我要做的就是懒惰地寻找$,然后懒惰地捕获所有内容,直到遇到下一个$。通过/g标志将其重复几次。每个捕获组将具有所需的字符串。

Demo