Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 嵌套或在正则表达式中_Javascript_Regex_Perl_Boost Regex_Boost Xpressive - Fatal编程技术网

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