Is er een niet-operator in RGEXES?
Zoals in die tekenreeks: "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"
Ik wil alle \([0-9a-zA-z _\.\-:]*\)
, maar niet degene waar het een jaar is: (2001)
.
Dus wat de regex moet terugkeren moet zijn: (2001) name
.
Opmerking: zoiets als \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)
werkt niet voor mij (De (20019)
op de een of andere manier overeenkomt met …)
Antwoord 1, Autoriteit 100%
Nee, er is geen directe exploitant. Op zijn minst niet zoals je hoopt.
U kunt een negatieve lookaHead van een zero-breedte gebruiken, echter:
\((?!2001)[0-9a-zA-z _\.\-:]*\)
De (?!...)
DEEL betekent “alleen overeenkomen als de tekst volgende (vandaar: lookahead) deze niet (Vandaar: negatief) match dit. Maar het is niet echt Consume de tekens die het overeenkomt (vandaar: nul-breedte).
Er zijn eigenlijk 4 combinaties van lookarounds met 2 assen:
- Lookbehind / Lookahead: specificeert als de tekens vóór of na het punt worden beschouwd als
- Positief / negatief: Geeft aan of de personages MOET MATCH of MOET MET NIET MOETEN MOETEN MOETEN.
Antwoord 2, Autoriteit 162%
Niet helemaal, hoewel u in het algemeen een werkverlening kunt gebruiken op een van de formulieren
[^abc]
, die karakter is door teken nieta
ofb
ofc
,- of negatieve lookahead:
a(?!b)
, diea
niet wordt gevolgd doorb
- of negatieve lookbehind:
(?<!a)b
, dat isb
niet voorafgegaan doora
Antwoord 3
Je zou het (2001)
-gedeelte kunnen vastleggen en de rest door niets kunnen vervangen.
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})\).*
betekent
.*
komt overal overeen\(
komt overeen met een(
teken(
begin met vastleggen[0-9]{4}
vier keer een enkel cijfer)
einde opname\)
komt overeen met een)
teken.*
alles (rest van de tekenreeks)