javascript - Regex för icke-upprepande alfabet, kommaseparerade


Jag har ett krav där jag behöver ett regex som

  1. bör inte upprepa alfabetet
  2. bör endast innehålla alfabet och komma
  3. bör inte börja eller sluta med kommatecken
  4. 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:

  1. 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.
  2. Strängen kan innehålla samma bokstav mer än en gång så länge #1 uppfylls.
  3. Med tanke på att A,,B,C är fel antar jag att ett kommatecken inte kan följa ett annat kommatecken.
  4. 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

Relaterade artiklar