/ / Regex dans lequel un groupe doit être obligatoire - c #, .net, regex

Regex dans laquelle un groupe doit être obligatoire - c #, .net, regex

Supposons que j'ai une chaîne comme

Q2

Il y a beaucoup de variations liées à cette chaîne comme

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

etc.

Mon regex est

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

S'il n'y a que "q" ou "Quarter", l'expression rationnelle sera identique

Je veux qu'un groupe (1 ou 7) soit obligatoire

Comment puis je faire ça?

Réponses:

0 pour la réponse № 1

Peut-être que vous pourriez essayer d’utiliser un groupe conditionnel (et en simplifiant un peu la regex, je pense, le rendrait plus lisible!):

(2|second)?[^wn]*(quarter|q)[^wn]*(?(1)|(2|second|two))

Le groupe conditionnel signifie:

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

En outre, il serait préférable d'utiliser ? (0 ou 1 fois) que * (0 fois ou plus) que j'ai déjà inclus dans la regex ci-dessus.


0 pour la réponse № 2

Vous pouvez essayer avec cette regex. Vous pouvez utiliser ?: à l'intérieur de (?:...) si vous ne voulez pas capturer les groupes:

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

Fondamentalement, il utilise regex piped (total quatre) en elle. Vous pouvez obtenir l'explication de la regex d'ici.


0 pour la réponse № 3

Essayez cette regex:

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

Le truc bouge Quarter à avant Q pour que Quarter sera vérifié en premier.

DEMO