捕获前缀或后缀或两者

时间:2018-02-09 08:41:01

标签: regex

我有捕获组(^A)(B)(C$)

的正则表达式

我想要匹配:

(^A)(B)(C$) or
(^A)(B) or
^(B)(C$)

基本上不是(B)本身。我正在寻找前瞻,后视,原子团体,无法弄清楚如何申请。

编辑:

Group A: ^([Ww]\d+\.?\d*)?

Group B: (([Xx]\d+)([Yy]\d+)?)

Group C: ([Zz]\d+)?$

我想抓拍

w10x10y10z10
w10x10z10
w10x10
x10y10z10
x10z10

不是

x10
x10y10

本身

3 个答案:

答案 0 :(得分:1)

您可以添加一个条件,以避免在开始时锚定的负前瞻的帮助下仅匹配BBC模式:

^(?!x\d+(?:y\d+)?$)(\d+\.?\d*)?((x\d+)(y\d+)?)(z\d+)?$
 ^^^^^^^^^^^^^^^^^^

请参阅regex demo注意:使用此正则表达式版本的用例不敏感修饰符)。

(?!x\d+(?:y\d+)?$)前瞻一旦匹配x,1 +位数,然后是Y和1+位数的可选序列,后跟字符串结尾,基本上会失败。

答案 1 :(得分:1)

我假设您尝试匹配的字符串有4组:

w: w\d+
x: x\d+
y: y\d+
z: z\d+

试图捕获的小组是:

wxyz
wxz
wx
wxy
xyz
xz
wz
w
z

但不是

x
y
xy

正则表达式可以完成这项工作:((?<=w\d+)|(?=z\d+))(x\d+)?(y\d+)?

答案 2 :(得分:0)

假设A是字符串头,C是字符串尾,B是字符串中间的东西。

/^AB|BC$/

如果B过于复杂,我们可以重新考虑B的含义,如下所示:

/^AB1|B2C$/

其中AC具有相同的含义。 B1表示中间子字符串的开头,B2表示其结尾。