Czy w Regexes jest operator NOT? Jak w tym ciągu:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"
Chcę usunąć wszystko \([0-9a-zA-z _\.\-:]*\)
, ale nie to, w którym to roku: (2001)
.
Więc co regex powinna zwracać muszą być: (2001) name
.
UWAGA: u mnie coś takiego \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)
nie działa ( (20019)
jakoś też pasuje ...)
(2001) name
.Odpowiedzi:
Nie, nie ma bezpośredniego operatora. Przynajmniej nie tak, jak masz nadzieję.
Można jednak użyć ujemnego antycypowania o zerowej szerokości:
\((?!2001)[0-9a-zA-z _\.\-:]*\)
Te
(?!...)
środki część „tylko pasuje jeśli tekst następujący (stąd: uprzedzona) to nie (stąd: negatywny). Pasujące do tego, ale faktycznie nie zużywają znaki pasuje (stąd: zerowej szerokości).W rzeczywistości istnieją 4 kombinacje lookarounds z 2 osiami:
źródło
\((?![\d]{4})[0-9a-zA-z _\.\-:]+\)
(20019)
{4}
zewnętrzne spojrzenie w przód, aw tym komentarzu umieściłeś je w środku : który z nich próbowałeś? Ponadto: jeśli chcesz(20019)
dopasować, musisz dodać\)
wnętrze swojego lookahead:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
\((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)
zatem, że wspornik nie jest zamknięty, prawda?)
ponieważ chcę dopasować literalny znak)
(tak jak robisz to na samym początku i na samym końcu twojego wyrażenia regularnego!). Następnie, po dopasowaniu tego, kończę lookahead, używając nieskrępowanego)
.Niezupełnie, chociaż zazwyczaj można zastosować obejście jednego z formularzy
[^abc]
, Który jest znak po znaku niea
lubb
czyc
,a(?!b)
któryma
nie następujeb
(?<!a)b
któreb
nie jest poprzedzonea
źródło
[^abc]
nie powinno oznaczać,a
lubb
czyc
nie „nie łańcuchabc
”.Możesz złapać
(2001)
część i zastąpić resztę niczym.public static string extractYearString(string input) { return input.replaceAll(".*\(([0-9]{4})\).*", "$1"); } var subject = "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"; var result = extractYearString(subject); System.out.println(result); // <-- "2001"
.*\(([0-9]{4})\).*
znaczy.*
dopasuj wszystko\(
dopasuj(
znak(
rozpocząć przechwytywanie[0-9]{4}
dowolna cyfra cztery razy)
koniec przechwytywania\)
dopasuj)
znak.*
cokolwiek (reszta ciągu)źródło