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