【问题标题】:Regex Non-capturing group when using OR ( | )使用 OR ( | ) 时的正则表达式非捕获组
【发布时间】:2019-07-16 16:25:43
【问题描述】:

我有什么:

我做了这个正则表达式/(\["?.+"?(?:,"?.+"?)*\]|(?:"([^"]*)"))(?:\.includes\("?)([^"]*)(?:"?\))/g

我想匹配[123].includes("Oi") == "asdasd" && "asdw".includes("w")

但在捕获组中,我想获取数组 [123] 或字符串,但没有引号 asdasd

我正在研究如何使用非捕获组并看到了这个(?:<CONTEXT>(<WHAT_YOU_NEED_TO_GET>)<CONTEXT>),所以我像这样制作了我的正则表达式,但是当我使用 OR (|) 时,这不起作用。

在第二场比赛中,我得到的捕获组是:

0: ""asdw".includes("w")"
1: ""asdw""
2: "asdw"
3: "w"

但我想得到的是:

0: ""asdw".includes("w")"
1: "asdw"
2: "w"

检查Here 以更好地查看捕获组

【问题讨论】:

  • 您是否尝试使用正则表达式来匹配 javascript 代码?因为.includes() 是一个数组和字符串方法。如果是这样,请解释一下用例吗?
  • 我有一个带文本的字符串,.includes() 是一个文本,而不是函数。问题只是在正则表达式中获取正确的捕获组,检查here
  • 我明白这一点。我的问题是为什么你有一个包含该文本的字符串开头。你在写一个 JS 解析器吗?我在问,因为如果您不是在编写解析器或其他操作 JS 代码的工具,那么可能有比正则表达式更好的方法来解决这个问题。
  • 如果你试图从任意 JS 代码中提取一些匹配项,你真的应该检查现有的 JS 解析器。
  • 我不想要更好的方法来解决这个问题,只想帮助我的正则表达式。我遇到的问题是正则表达式,而不是解析 js。

标签: javascript regex


【解决方案1】:

添加这些作为答案。

问题在于第一个捕获组。内部非捕获只是告诉引擎不要生成捕获,但它已经被外部组捕获。

(\["?.+"?(?:,"?.+"?)*\]|(?:"([^"]*)")) 替换为(?:\"([^"]*)\"|(\[[^\]]*\])) 应该可以完成工作。

Demo.

【讨论】:

  • 并且替换你说的部分,并没有解决问题,它仍然创建3组,其中第二组未定义
  • 刚刚为 javascript 编辑。仍然只搜索 2 组,但我还没有明显的解决方案。您如何利用代码中的结果?
  • 我只想要 2 个组的原因是因为当我破坏数组时,我不需要使用里面没有任何内容的逗号,例如 let [match, , field, , atribute] = exec
  • 如果我只使用一个 OR ( | ),我只需要一个逗号,但如果我有更多,我需要更多,代码对我和其他程序员来说将更难理解
  • 对不起,我能想到的最好只使用正则表达式。
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多