正则表达式中任何一个组必须是强制性的

时间:2014-03-20 13:06:22

标签: c# .net regex

假设我有一个字符串

Q2

有许多与此字符串相关的变体,如

Q2
Quarter two
Quarter 2
2-Q
2.Q
Q.2
Q-2
Second Quarter 

我的正则表达式是

((2)|(second))*\W*((q)|(quarter))\W*((2)|(second)|(two))*

如果只有“q”或“Quarter”正则表达式匹配

我希望任何一组(1或7)是必修课

我该怎么做?

3 个答案:

答案 0 :(得分:0)

你可以试试这个正则表达式。如果您不想捕获组,可以在?:内使用(?:...)

\b((Q[.-]?2)|(Quarter (two|2))|(2[-.]?Q)|(Second Quarter))\b

基本上它使用了管道正则表达式(共四个)。您可以获得正则表达式from here的解释。

答案 1 :(得分:0)

也许你可以尝试使用一个条件组(并且有点简化正则表达式,我认为会让它更具可读性!):

(2|second)?[^\w\n]*(quarter|q)[^\w\n]*(?(1)|(2|second|two))

条件组意味着:

(?(1)          # If group 1 exists then:
               # Nothing
|              # Else
(2|second|two) # Get match this group
)

此外,使用?(0或1次)比*(0次或更多次)更好,我已经包含在上面的正则表达式中。

答案 2 :(得分:0)

试试这个正则表达式:

(((2|Second|two)(\s|-|\.)?(Quarter|Q))|(Quarter|Q)(\s|-|\.)?(2|Second|two))

诀窍是将Quarter移至Q之前,以便首先检查Quarter

DEMO