/ / Regex, в която всяка група трябва да е задължителна - c #, .net, regex

Regex, в която всяка група трябва да е задължителна - 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) да бъде задължителна

Как мога да направя това?

Отговори:

0 за отговор № 1

Може би бихте могли да опитате да използвате условна група (и опростяване на малкото понятие, което според мен би направило по-разбираемо!):

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

Подразбиращата се група означава:

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

Също така би било по-добре да го използвате ? (0 или 1 път) от * (0 или повече пъти), които вече включих в горния регекс.


0 за отговор № 2

Можете да опитате с този регекс. Можеш да използваш ?: вътре в (?:...) ако не искате да улавяте групите:

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

По принцип той използва тръбопроводен регекс (общо четири) в него. Можете да получите обяснение на регекс оттук.


0 за отговор № 3

Опитайте този регекс:

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

Трикът се движи Quarter до преди Q така че Quarter ще бъдат проверени първо.

ДЕМОНСТРАЦИЯ