如何获得" ^ pearl(pig | hog)+ $"的匹配输出?

时间:2014-07-30 08:26:07

标签: javascript regex

如何从^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

http://jsfiddle.net/9mz23/5/

对于{2} hog,pig,pig,hogtest1,对于test2,我想要的是null

2 个答案:

答案 0 :(得分:1)

JavaScript既没有\G CaptureCollection

:一种。测试1

如果我理解,在以pearl开头的字符串中,您想要检索hogpig的单个实例。首先让我们讨论一般解决方案。

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
  • 处理来自组1的各个匹配项

<强> B中。测试2

如果我理解,您想要的是匹配仅由pighog组成的字符串,一次匹配一个字符串。在支持\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说的那样,你目前无法在一个正则表达式中完成这个任务。