Po pierwsze, uzgodnijmy warunki. Moja składniowej założenie będzie, że
skrzyżowaniu kilku regexes jest regex, który pasuje ciągi że każdy z regexes składowych również dopasować.
Walne Wariant
Aby sprawdzić przecięcia dwóch wzorów, ogólna metoda (pseudo-kod):
if match(regex1) && match(regex2) { champagne for everyone! }
Opcja Regex
W niektórych przypadkach możesz zrobić to samo z uprzedzeniami, ale w przypadku złożonego wyrażeń regularnych nie ma takiej korzyści, niezależnie od tego, Sprawia, że twoje regex jest bardziej niezrozumiałe dla twoich wrogów. Dlaczego małe korzyści? Ponieważ silnik i tak będzie musiał wielokrotnie analizować cały ciąg znaków.
logiczna AND
Ogólny wzór dla i sprawdzając, czy ciąg dokładnie spełnia regex1 i regex2 byłoby:
^(?=regex1$)(?=regex2$)
$
w każdym uprzedzona gwarantuje, że każdy łańcuch pasuje do wzorca i nic więcej.
Matching kiedy i
Oczywiście, jeśli nie chcą po prostu sprawdzić wartość logiczną AND ale również zrobić rzeczywiste dopasowanie, po lookaheads, można dodać dot-gwiazda konsumować ciągu:
^(?=regex1$)(?=regex2$).*
Albo ... Po sprawdzeniu pierwszego warunku, po prostu pasuje do drugiego:
^(?=regex1$)regex2$
jest to technika używana na przykład w sprawdzaniu poprawności haseł. Aby uzyskać więcej informacji na ten temat, zobacz Mastering Lookahead and Lookbehind.
sekcja Bonus: Związek regexes
Zamiast pracować na skrzyżowaniu, powiedzmy jesteś zainteresowany w związku z następujących regexes, tj, Wyrażenie regularne, która odpowiada jednej z tych regexes:
- połowach
- CAT1
- cat2
- cat3
- kategorii 5
Osiąga się to za pomocą operatora naprzemiennie |
:
catch|cat1|cat2|cat3|cat5
Ponadto taki regex często mogą być skompresowane, jak w:
cat(?:ch|[1-35])
Czy interesują Cię matematyczne wyrażenia regularne lub konkretne praktyczne zastosowania, takie jak PCRE? –
@ n.m .: w obu. Do implementacji, python lub perl. – Tim