Javascript 如何从“获取匹配的输出?”^珍珠(猪)&x2B$&引用;?

Javascript 如何从“获取匹配的输出?”^珍珠(猪)&x2B$&引用;?,javascript,regex,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

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

我想要的是
test1的
hog,pig,pig,hog
,test2的
null

JavaScript既没有
\G
CaptureCollection A.测试1

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

劳斯莱斯:CaptureCollection

在.NET中,如果对
pearlhogg
使用
pearl(pig | hog)+
,则可以从组1捕获集合中检索值
hog,pig,pig,hog
。NET在允许您回收编号的组方面是独一无二的。看

吉普车:
\G

在支持
\G
的发动机中,您可以使用
(?:pearl |\G(?)进行多次匹配,并从组1值中获得
猪、猪、猪

JavaScript:两个步骤(验证,然后处理)

JS没有这两个功能。我将分两步处理:

  • 使用
    ^pearl(pig | hog)+$
  • 通过使用
    pig | hog

B.测试2

如果我理解,您希望匹配的字符串仅由
pig
hog
组成,一次匹配一个。在支持
\G
的引擎中,您可以执行以下操作:

(?:^(?=(?:pig|hog)+$)|\G(?<!^))(pig|hog)
(?:^(?=(?:猪|猪)+$)\G(?)?
同样,不是JS中的支持者。我将分两步进行:

  • 通过匹配
    ^(清管器|清管器)+$
  • 使用
    (pig | hog)

参考


    • 您可以通过

      var test1 = 'pearlhogpigpighog';
      
      var groupedMatches = test1.match(/^pearl((?:pig|hog)+)$/);
      
      if (groupedMatches) {
          console.log(groupedMatches[1].match(/pig|hog/g));
      }
      

      就像@zx81所说的,你目前不能在一个regexp中完成这一点。

      为什么不
      regex1
      匹配
      test2
      ?它在末尾包含
      perlpig
      。如果你只想在开头匹配,你应该使用
      ^
      锚。谢谢@Barmar,添加了
      ^
      $
      。那么现在的问题是什么呢?@Barmar:我现在编辑了这个问题。两部分的解决方案有效:但有没有更简单的方法?仅供参考,大大扩展了答案。更简单的方法?XRegExp(替代JS regex库)可能支持
      \G