Chcę wykonać wyrażenie regularne dla dowolnych alfabetów oprócz "e" to właśnie wymyśliłem -

/([a-d]|[f-z])+?/i
  • Powyższy regex nie pasuje do "E", co jest dobre.
  • Pasuje do "Ameryki"
  • Ale pasuje również do "Ameryki", ale nie powinno to z powodu "E" w Ameryce

Co ja robię źle?

8
Adam 27 czerwiec 2017, 06:16

4 odpowiedzi

Najlepsza odpowiedź

Potrzebujesz kotwic ^ (początek łańcucha) i $ (koniec łańcucha); W przeciwnym razie twój wzór może być częściowo dopasowany do dowolnego ciągu tak długo, jak zawiera alfabet inny niż e :

/^[a-df-z]+$/i.test("america")
// false

/^[a-df-z]+$/i.test("amrica")
// true

/^[a-df-z]+$/i.test("e")
// false
6
Psidom 27 czerwiec 2017, 03:20

Kilka alternatywnych odpowiedzi to:

  1. Użyj lookhead:

    /^((?=[a-z])[^e])+$/i
    

Jest to pierwszy sprawdzanie, czy następna postać jest listem, a wtedy sprawdza, czy nie jest to e (lub E).

Jest to ważna składnia regex w javascript, ale jest mniejsza niż akceptowana odpowiedź.

  1. Użyj skrzyżowania zestawu:

    /^[[a-z]&&[^e]]+$/i
    

Jest to pasujące znaki w przecięciu zestawu "a-z" i "nie e".

To jest nie ważna składnia w JavaScript . Jednak jest równie występującym, jak przyjęta odpowiedź. Jest to tylko ważna składnia w różnych innych regularnych "smakach" takich jak Java, Perl, PHP, Python i Ruby.

  1. Użyj zestawu odejmowania:

    /^[[a-z]--[e]]+$/i
    

Dopasowane jest to znaki w odejmowaniu urządzeń "a-z" i {x1}}.

To jest nie ważna składnia w JavaScript . Jednak jest równie występującym, jak przyjęta odpowiedź. Jest to tylko ważna składnia w różnych innych regularnych "smakach" takich jak Python i .NET. (Składnia jest również nieznacznie zmienia, np. - vs {x1}}.)

0
Tom Lord 27 czerwiec 2017, 09:21

Możesz także dodać kapitał w Reg Użyj tego:

^[a-df-zA-DF-Z]+$

i.test("America")
// false

i.test("Amrica")
// true

i.test("e")   or  i.test("E") 
// false

Patrz wiele stron internetowych, aby nauczyć się kreacji Regexa krok po kroku https://regex101.com

1
nnnnnn 27 czerwiec 2017, 03:55

Możesz użyć klasy znaków [a-z], ale ogranicz go z negatywne lookhead (?!e), grupa tego wzoru z grupą grupową (?:...) i dodaj kotwice wokół wzoru:

/^(?:(?!e)[a-z])+$/i

Zobacz REGEX DEMO.

Ta technika będzie działać we wszystkich flavorach REGEX, które obsługują lookheads. Uwaga w Javie i niektórych językach, możesz używać Wyjęcie klasy znaków , ale nie jest obsługiwany przez JS REGEXP (ani Python re). E.G. W Javie można użyć s.matches("(?i)[a-z&&[^e]]+").

Szczegóły wzoru :

  • ^ - początek ciągu
  • (?:(?!e)[a-z])+ - 1 lub więcej znaków z a-z i A-Z} e i E
  • $ - kotwica końca łańcucha
  • i - modyfikator niewrażliwy.

Demo JS:

var rx = /^(?:(?!e)[a-z])+$/i;
var strs = ['america','e', 'E', 'world','hello','welcome','board','know'];
for (var s of strs) {
  console.log(s, "=>", rx.test(s));
}
6
Graham 24 wrzesień 2017, 04:52