如何从^pearl(pig|hog)+$
获得匹配的输出?
var test1 = "pearlhogpigpighog"; // this string should match
var test2 = "pigpighogpearlpig"; // this string shouldn't match
var regex1 = /^pearl(pig|hog)+$/; // thought this should work
var regex2 = /(pig|hog)/g; // gives correct output on test1 but accepts test2
test1.match( regex1 ); // output: pearlhogpigpighog,hog
test2.match( regex1 ); // output: null
test1.match( regex2 ); // output: hog,pig,pig,hog
test2.match( regex2 ); // output: pig,pig,hog,pig
对于{2} hog,pig,pig,hog
和test1
,对于test2,我想要的是null
。
答案 0 :(得分:1)
\G
CaptureCollection :一种。测试1
如果我理解,在以pearl
开头的字符串中,您想要检索hog
或pig
的单个实例。首先让我们讨论一般解决方案。
The Roll Royce:CaptureCollection
在.NET中,如果您对pearl(pig|hog)+
使用pearlhogpigpighog
,则可以从Group 1 Capture Collection中检索值hog,pig,pig,hog
。 .NET在允许您回收编号组方面是独一无二的。见Capture Group Numbering & Naming: The Gory Details
吉普车:\G
在支持\G
的引擎中,您可以使用(?:pearl|\G(?<!^))(pig|hog)
多次匹配,并从组1值中获取hog,pig,pig,hog
。
JavaScript:两个步骤(验证,然后处理)
JS既没有这两个功能。我会分两步处理:
^pearl(pig|hog)+$
pig|hog
<强> B中。测试2
如果我理解,您想要的是匹配仅由pig
或hog
组成的字符串,一次匹配一个字符串。在支持\G
的引擎中,您可以执行以下操作:
(?:^(?=(?:pig|hog)+$)|\G(?<!^))(pig|hog)
再次,不是JS中的支持者。我将分两步进行:
^(pig|hog)+$
(pig|hog)
<强>参考强>
答案 1 :(得分:1)
您可以通过
完成此操作var test1 = 'pearlhogpigpighog';
var groupedMatches = test1.match(/^pearl((?:pig|hog)+)$/);
if (groupedMatches) {
console.log(groupedMatches[1].match(/pig|hog/g));
}
像@ zx81说的那样,你目前无法在一个正则表达式中完成这个任务。