Jest to prawdopodobnie prostsze dzięki prostemu analizatorowi składni. Ale ty can do this z.NET regex przy użyciu balancing groups i zdając sobie sprawę, że jeśli nawiasy są usuwane z łańcucha, zawsze masz ciąg dopasowany prostym wyrażeniem, takim jak ^\d+(?:\s+(?:AND|OR)\s+\d+)*\z
.
Wszystko co musisz zrobić, to użyć grup równoważących, aby upewnić się, że nawiasy są zrównoważone (i są we właściwym miejscu w odpowiedniej formie).
Przepisanie wyrażenia powyższej trochę: (. (?x)
sprawia, że silnik regex ignorować wszystkie białe znaki i komentarze w strukturze, dzięki czemu może być bardziej czytelny)
(?x)^
OPENING
\d+
CLOSING
(?:
\s+(?:AND|OR)\s+
OPENING
\d+
CLOSING
)*
BALANCED
\z
Gdzie OPENING
dopasowuje dowolny liczba (0 włączone) otworu nawiasami
\s* (?: (?<open> \() \s*)*
CLOSING
pasuje do dowolnej liczby wsporników zamykających również upewniając się, że grupa wyważanie jest zbilansowany:
\s* (?: (?<-open> \)) \s*)*
i BALANCED
wykonuje test bilansujący, w przeciwnym razie, jeśli tam są bardziej otwarte nawiasy następnie zamknięty:
(?(open)(?!))
Nadanie wyrażenia:
(?x)^
\s* (?: (?<open> \() \s*)*
\d+
\s* (?: (?<-open> \)) \s*)*
(?:
\s+(?:AND|OR)\s+
\s* (?: (?<open> \() \s*)*
\d+
\s* (?: (?<-open> \)) \s*)*
)*
(?(open)(?!))
\z
Jeśli nie chcesz, aby losowe spacje były usuwane, co \s*
.
Przykład
Patrz Demo w IdeOne. Wyjście:
matched: '2'
matched: '1 AND 2'
matched: '12 OR 234'
matched: '(1) AND (2)'
matched: '(((1)) AND (2))'
matched: '1 AND 2 AND 3'
matched: '1 AND (2 OR (3 AND 4))'
matched: '1 AND (2 OR 3) AND 4'
matched: ' (1 AND (2 OR (3 AND 4) )'
matched: '((1 AND 7) OR 6) AND ((2 AND 5) OR (3 AND 4))'
matched: '(1)'
matched: '(((1)))'
failed: '1 2'
failed: '1(2)'
failed: '(1)(2)'
failed: 'AND'
failed: '1 AND'
failed: '(1 AND 2'
failed: '1 AND 2)'
failed: '1 (AND) 2'
failed: '(1 AND 2))'
failed: '(1) AND 2)'
failed: '(1)() AND (2)'
failed: '((1 AND 7) OR 6) AND (2 AND 5) OR (3 AND 4))'
failed: '((1 AND 7) OR 6) AND ((2 AND 5 OR (3 AND 4))'
failed: ''
jest również możliwe, aby mieć tę kombinację? '4 I 5 (3 LUB 5) LUB (4 I 6)' lub itp. –
@John Woo Nie ... Po pierwszych 5 nie ma operatora. Ale jeśli miałeś na myśli długi wyraz z wieloma kombinacjami, to tak. –
Dopasowywanie nawiasów klamrowych jest kanonicznym przykładem czegoś, czego zwykły język nie może zrobić. – harold