2011-11-18 13 views
17

Mam problem z jedną częścią wyrażenia regularnego, które będzie używane w JavaScript. Potrzebuję sposobu na dopasowanie dowolnego znaku innego niż znak +, pusty ciąg powinien również pasować.Wyrażenie regularne - dopasuj dowolny znak z wyjątkiem +, pusty ciąg również powinien być dopasowany

[^+] jest prawie to, co chcę, ale nie pasuje do pustego napisu. Próbowałem myśleć: "każda postać inna niż +, zero lub więcej razy", ale to pasuje do wszystkiego, łącznie z +.

+0

Jak to możliwe, że '[^ +] *' dopasowuje '+ '? To nie ma sensu. Z twoim wyrazem musi być coś jeszcze nie tak. –

+1

@ScottRippey: Zgaduję (w mojej odpowiedzi), że kwantyfikator '*' pozwalał na pomyślne zakończenie dopasowania przez dopasowanie niczego (zero znaków, które nie są '+'). Bez żadnych zakotwiczeń i innych twierdzeń teoretycznie może się równać przed lub po znaku '+ ', umożliwiając dopasowanie całego ciągu znaków. (Oczywiście, że pasowałoby to wcześniej, ponieważ to jest pierwsze, a na tym się skończyło) czy ta ocena nie ma dla ciebie sensu? –

Odpowiedz

18

dodać {0,1} do niego tak, że będzie on pasował tylko zero lub jedno razy, nie więcej nie mniej:

[^+]{0,1} 

Albo, jak FailedDev wskazał, ? działa zbyt:

[^+]? 

Zgodnie z oczekiwaniami, testowanie z konsoli JavaScript Chrome pokazuje nie pasuje do "+" ale pasuje do innych znaków:

x = "+" 
y = "A" 

x.match(/[^+]{0,1}/) 
[""] 

y.match(/[^+]{0,1}/) 
["A"] 

x.match(/[^+]?/) 
[""] 

y.match(/[^+]?/) 
["A"] 
+3

Nie, nie musisz tego wymykać, po drugie {0,1} =?. +1 Niemniej jednak. – FailedDev

+0

Obie opcje wydają się pasować do wszystkiego, w tym tylko + zgodnie z http://www.regular-expressions.info/javascriptexample.html – zaq

+0

Według powyższej witryny, ta jedna nie pasuje do niczego. – zaq

4

Jeśli dopiero testowania ciąg aby sprawdzić, czy nie zawiera +, należy użyć:

^[^+]*$ 

To będzie pasował tylko jeśli cały ciąg ma +.

+0

To jest właściwie tylko część większego wyrażenia, więc niekoniecznie chcę dopasować cały ciąg. – zaq

18
  • [^+] oznacza „dopasować dowolny pojedynczy znak, który nie jest +
  • [^+]* oznacza „dopasować dowolną liczbę znaków, które nie są +” - co wydaje się prawie jak to, co myślę, że chcesz, oprócz tego, że będzie on pasował zero znaków, jeśli pierwszy znak (lub nawet wszystkie znaki) to +.

użycie kotew, aby upewnić się, że wyrażenie sprawdza cały ciąg:

^[^+]*$ 

oznacza:

^  # assert at the beginning of the string 
[^+]* # any character that is not '+', zero or more times 
$  # assert at the end of the string 
Powiązane problemy