【问题标题】:Javascript: check if regular expression contains a capturing group without executing it [closed]Javascript:检查正则表达式是否包含捕获组而不执行它[关闭]
【发布时间】:2022-01-22 23:46:13
【问题描述】:

是否可以测试 javascript regex 是否包含捕获组而不执行它,使用 js regex api 而不是自己编写检查

这样的功能应该给出这些结果:

'US-.*' // false
'US-(.*)' // true
'US-(?:east|west)' // false, parentheses define non-capturing group
'US-\(.*\)' // false, escaped parentheses
// etc.

我可以写一个可以判断的正则表达式,但在某些极端情况下可能会关闭,所以询问JS引擎本身会更可靠。

我的用例:我有一个组件,它使用用户定义的正则表达式来过滤一组输入字符串,并从匹配该正则表达式的字符串中创建一个组。如果正则表达式包含捕获组,则第一个用作组名。否则,用户必须在另一个表单字段中明确定义组名(当正则表达式包含捕获组时禁用)。因此,在编写正则表达式时,我什至没有数据集来执行正则表达式并检查是否有匹配的子字符串。

【问题讨论】:

  • What topics can I ask about here?: “我需要一个能够提供...的函数”不是其中之一。
  • 没有相应的 API。考虑到捕获组可能出现在正则表达式中,因此它可能不参与匹配,因为它可能在表达式的条件部分中。
  • @Andreas 我问是否可以使用 JS 引擎/API,而不是为我编写函数。下次请仔细阅读问题,谢谢。 “我需要一个函数”的意思是“这描述了我最能解决的问题”,而不是“为我写”。
  • @Pointy 感谢您的回答 - 是的,捕获组可以是可选的,但我可以想象 API 仍然可以给我一些线索,例如如果 JS 有一个用于其正则表达式 AST 解析器的 API。
  • "Is it possible to..." 要求回答是或否。这对 SO 有什么用?结合 “我需要...” 使这成为一个 “我没有做过任何研究。请为我做这件事并添加一个可行的解决方案”

标签: javascript regex


【解决方案1】:

使用正则表达式的toString() 函数

您必须自己测试正则表达式,否则您将自己编写类似的东西。例如,逃脱的( 怎么样? \( 不是捕获组。

因此您可以创建一个RegExp 对象并将其表达式作为字符串进行测试。无效的正则表达式会抛出错误。

请参阅下面的演示。这很聪明,可以找到转义的捕获组(正则表达式中的\()并确定其中至少一个是否是真正的捕获组。
您必须添加 try/catch 处理自己以确保用户输入有效的正则表达式。

您必须添加对非捕获组的支持。但我想你明白了。

示例:

  • 'US-(?:east|west)':是的
  • 'US-\\(?:east|west\\)':没有
  • 'US-\\(?:east|west\\)(hello)':是的

链接:

正则表达式对象:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp

// Get regular expression as string (even though we have to supply it, it validates it for us)
let regEx = new RegExp('US-(?:east|west)');
let asString = regEx.toString();
document.getElementById('regex').innerText = asString;

// Note: This also checks for escaped capture groups ('\(' in the expression).
//       It even works if some capture groups are escaped and some are not.
let hasGroup = new RegExp(/(?<!\\)\(/g);
let hasGroupResult = hasGroup.test(asString);
document.getElementById('hasGroup').innerText = hasGroupResult ? 'Yes' : 'No';
<html>
<body>
<p>
  <strong>Regular Expression:</strong> <code id="regex"></code>
</p>
<p>
  <strong>Has capture group:</strong> <code id="hasGroup"></code>
</p>
</body>
</html>

【讨论】:

  • 谢谢,但正如我在问题中所写,我知道我可以编写一个正则表达式来分析正则表达式,但使用 API 会更可靠,因为它会使用相同的 AST 解析而不是尝试找出正则表达式中所有可能的情况(我更有可能错过一些)。
  • 它没有 API。没有必要,因为您可以通过使用自身来检测正则表达式。通读我链接到的文档。这就是 RegExp 对象的全部内容。
  • Kerbs 正如我之前所写的“我知道我可以编写一个正则表达式来分析正则表达式”。老实说,伙计们,你能告诉我如何清楚地说出来吗?我看到你不是唯一没有得到的人,请参阅主帖上的线程。
  • 另外,如果你仔细阅读我的问题,你会发现我无法通过运行正则表达式来找到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
相关资源
最近更新 更多