【问题标题】: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"]

标签: javascript regex reactjs


【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2020-11-13
      • 2014-05-09
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2014-07-12
      相关资源
      最近更新 更多