是否可以测试一个javascript正则表达式是否包含一个捕获组而不执行它?
理想情况下,使用JS正则表达式引擎,我想我可以编写一些正则表达式来分析正则表达式:),但询问正则表达式引擎本身肯定更可靠。
我需要一个函数来给出这些结果:
'US-.*' // false
'US-(.*)' // true
'US-(?:east|west)' // false, parentheses define non-capturing group
'US-\(.*\)' // false, escaped parentheses
// etc.
我的用例:我有一个组件,它使用用户定义的正则表达式来过滤一组输入字符串,并从那些匹配正则表达式的字符串中创建一个组。如果正则表达式包含捕获组,则将第一个用作组名称。否则,用户必须在另一个表单字段中显式定义组名称(当正则表达式包含捕获组时禁用)。因此,在编写正则表达式时,我甚至没有一个数据集来执行正则表达式并检查是否有匹配的子字符串。
您必须测试正则表达式本身,否则您将自己编写类似的东西。例如,转义的(
)呢?\(
不是捕获组。
因此,您可以创建一个RegExp
对象,并将其表达式作为字符串进行测试。无效的正则表达式将引发错误。
请参见下面的演示。这非常聪明,可以找到转义的捕获组(\(
在正则表达式中),并确定其中是否至少有一个是真正的捕获组
您必须添加try/catch
自行处理,以确保用户输入有效的正则表达式。
您必须添加对非捕获组的支持。但我想你明白了。
示例:
'US-(?:东|西)
:是链接:
RegExp对象:
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>