javascript - Regex för icke-upprepande alfabet, kommaseparerade
Jag har ett krav där jag behöver ett regex som
- bör inte upprepa alfabetet
- bör endast innehålla alfabet och komma
- bör inte börja eller sluta med kommatecken
- kan innehålla mer än 2 alfabet
exempel :-
A,B --- correct
A,B,C,D,E,F --- correct
D,D,A --- wrong
,B,C --- wrong
B,C, --- wrong
A,,B,C --- wrong
Kan någon hjälpa?
Svar #1
En annan idé med fångst och kontroll genom användning av en lookahead:
^(?:([A-Z])(?!.*?\1),?\b)+$
Du kan testa här på regex101 om det uppfyller dina krav.
Om du inte vill matcha enstaka tecken, t.ex. A, ändra + kvantifieraren till {2,}.
Svar #2
Frågeställningen är ofullständig på flera sätt. Jag har gjort följande antaganden:
- Med tanke på att
D,D,Aär fel antar jag att en bokstav inte kan följas av ett kommatecken följt av samma bokstav. - Strängen kan innehålla samma bokstav mer än en gång så länge #1 uppfylls.
- Med tanke på att
A,,B,Cär fel antar jag att ett kommatecken inte kan följa ett annat kommatecken. - Eftersom exemplen endast innehåller versaler antar jag att gemener inte är tillåtna (även om man bara behöver sätta flaggan för skiftlägesokänslighet (
i) för att tillåta båda fall).
Vi observerar att kraven är uppfyllda om och endast om strängen börjar med en versal och följs av en sekvens av komma-versal-par, förutsatt att ingen versal följs av ett komma följt av samma bokstav. Vi kan därför försöka matcha följande reguljära uttryck.
^(?:([A-Z]),(?!\1))*[A-Z]$
Demo
Elementen i uttrycket är följande.
^ # match beginning of string
(?: # begin a non-capture group
([A-Z]) # match a capital letter and save to capture group 1
, # match a comma
(?!\1) # use negative lookahead to assert next character is not equal
# to the content of capture group 1
)* # end non-capture group and execute it zero or more times
[A-Z] # match a capital letter
# match end of string
