Javascript 嵌套或在正则表达式中
如何匹配需要对另一组进行Javascript 嵌套或在正则表达式中,javascript,regex,perl,boost-regex,boost-xpressive,Javascript,Regex,Perl,Boost Regex,Boost Xpressive,如何匹配需要对另一组进行或运算的表达式 i、 例如,如何匹配格式的某些内容 [ [ [ a | b ] | [ x | y ] ] ] 其中a、b、x和y是字符串 我想匹配以下短语 a b x y a x a y b x b y x a x b y a y b 但不是像这样的: a b x y z z 我试图在Boost Xpressive中使用它,因此我可以选择使用ECMAScript或Perl类型的正则表达式。尝试以下方法: ^((a|b)( x| y)?|(
或运算的表达式
i、 例如,如何匹配格式的某些内容
[
[
[ a | b ] |
[ x | y ]
]
]
其中a、b、x和y是字符串
我想匹配以下短语
a
b
x
y
a x
a y
b x
b y
x a
x b
y a
y b
但不是像这样的:
a b
x y
z z
我试图在Boost Xpressive中使用它,因此我可以选择使用ECMAScript或Perl类型的正则表达式。尝试以下方法:
^((a|b)( x| y)?|(x|y)( a| b)?)$
正则表达式的解剖:
# ^ - Line start
# ( - Group start
# (a|b)( x| y) - Match A or B followed by X or Y
# ? - Where (X|Y) is optional
# | - Or
# (x|y)( a| b) - Match X or Y followed by A or B
# ? - Where (A|B) is optional
# ) - And group
# $ - End of line.
这符合:
a y
b a x
x y b
但不是:
a b
x y
z z
您可以这样做:
[ab] [xy]|[xy] [ab]|[abxy]
这里有3种选择:
- 仅
a
,b
,x
,y
(单个字符)
- 或者两个字符,
a
或b
位于x
或y
之前,中间有空格
- 或者两个字符,
x
或y
位于a
或b
之前,中间有空格
我把[abxy]
放在后面,以防万一当你搜索时,它会先搜索前面的那些(成对的),然后再搜索单个的。如果使用正则表达式进行搜索,顺序很重要,但在进行验证时,顺序无关紧要
另一种写作方式:
[ab]( [xy])?|[xy]( [ab])?
这只适用于字符,但可以使其适用于字符串。例如,假设您有4个字符串s1
,s2
,s3
,s4
:
(s1|s2)( (s3|s4))?|(s3|s4)( (s1|s2))?
它搜索:
s1
或s2
,可以是也可以不是(0或1个实例),后跟s3
或s4
- (反过来说)
这涵盖了s1
,s2
等的所有情况(单个字符串),s2 s3
,s3 s2
等(成对排列,可以颠倒顺序)。由于量词的默认贪婪属性,上面的正则表达式将在使用单个字符串之前搜索较长的版本(成对)
注意,我在上面的正则表达式中使用了捕获组(pattern)
,它将记录与模式匹配的字符串的位置。如果不需要引用与模式匹配的文本,可以将它们设置为非捕获组(?:模式)
。这将为您节省一些时钟周期
(?:s1|s2)(?: (?:s3|s4))?|(?:s3|s4)(?: (?:s1|s2))?
(我将另一个正则表达式的捕获组更改为非捕获组的任务留作练习。它只需添加?:
)
搜索或验证?
如果您想找到这样的模式,那么上面的正则表达式应该适合您
如果要验证字符串是否与模式匹配,则需要使用锚点^
(匹配字符串的开头)、$
(匹配字符串的结尾)以确保字符串符合正确的格式:
^([ab] [xy]|[xy] [ab]|[abxy])$
^([ab]( [xy])?|[xy]( [ab])?)$
^((s1|s2)( (s3|s4))?|(s3|s4)( (s1|s2))?)$
^(?:(?:s1|s2)(?: (?:s3|s4))?|(?:s3|s4)(?: (?:s1|s2))?)$
注意,我用()
(捕获组,但实际上我只需要在这里分组)包围了上述部分中的正则表达式。这是因为我有一个替代|
在里面
扩展性和限制
- 您可以根据需要向第一组或第二组添加更多字符串:
^([abcd]( [xyz])?|[xyz]( [abcd])?)$
- 但是,如果您想增加组的数量,我建议您将字符串按空格分割,并循环遍历标记以查找组的排列,而不是使用正则表达式
简单:
(a|b|x|y|((a|b) (x|y))|((x|y) (a|b)))
如果不在正则表达式中重复a
、b
、x
和y
,没有一种方便的方法可以做到这一点,但是可以通过从预先声明的子表达式构建表达式来缓解此问题
这段代码演示。请注意,数据的前三行是无效的,它们不会在输出中再现
use v5.10;
use warnings;
my $ab = qr/a|b/;
my $xy = qr/x|y/;
my $re = qr/^
(?:
$ab (?: \s+ $xy)? | $xy (?: \s+ $ab)?
)
$/x;
while (<DATA>) {
print if /$re/;
}
__DATA__
a b
x y
z z
a
b
x
y
a x
a y
b x
b y
x a
x b
y a
y b
所以你想匹配a,b,x,y,ax,ay,bx,by?这比看起来要复杂一些…正如我在问题中提到的,Perl或JS或Boost会很好。你确定你想要yb
而不是by
?还是两者都有?@Fabricio Mattéa,b,x,y,a x,a y,b x,b y,x a,x b,y a,y b。请注意a和x之间的空格。交替是关联的,所以除了捕获之外,((a | b)|(x | y))
与a | b | x | y
是相同的。@Borodin:编辑了我的答案。如果是你的,请删除下一票好吗?我建议你将此一票改为使用“[ab]”而不是“(a | b)”,同样适用于“(x | y)”@SEoF:其中a,b,x和y是字符串。
。因此
(|)
啊,我错了。“^((a | b)((x | y))?|(x | y)((a | b))?)$”将从字符串中分离出空格,然后您可以在需要提取字符串的空格之前向开括号中添加“?:”。请注意,这适用于单个字符。我相信OP会使用a
,b
等来表示字符串,就像问题所暗示的“我想匹配字符串一样”。@fabriciomatté:好的。。。将编辑…+1,看起来这将很好地工作。为什么在((s3 | s4))?
?@Cerbrus上的双组将空间分组,使其与第二个交替组一起成为可选。
a
b
x
y
a x
a y
b x
b y
x a
x b
y b