Javascript:检查正则表达式是不是包含捕获组而不执行它[关闭]
Posted
技术标签:
【中文标题】Javascript:检查正则表达式是不是包含捕获组而不执行它[关闭]【英文标题】: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 有什么用?结合 “我需要...” 使这成为一个 “我没有做过任何研究。请为我做这件事并添加一个可行的解决方案” 【参考方案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 正如我之前所写的“我知道我可以编写一个正则表达式来分析正则表达式”。老实说,伙计们,你能告诉我如何清楚地说出来吗?我看到你不是唯一没有得到的人,请参阅主帖上的线程。 另外,如果你仔细阅读我的问题,你会发现我无法通过运行正则表达式来找到它。以上是关于Javascript:检查正则表达式是不是包含捕获组而不执行它[关闭]的主要内容,如果未能解决你的问题,请参考以下文章