2009-12-01 11 views
5

Mam problem z wyrażeniem regularnym. Potrzebuję wykonać wyrażenie regularne z wyjątkiem zestawu określonych słów, na przykład: jabłko, pomarańcza, sok. i biorąc pod uwagę te słowa, dopasuje wszystko oprócz tych słów powyżej.Regex z wyjątkiem szczególnych słów

apple (should not match) 
applejuice (match) 
yummyjuice (match) 
yummy-apple-juice (match) 
orangeapplejuice (match) 
orange (should not match) 
juice (should not match) 
orange-apple-juice (match) 
apple-orange-aple (match) 
juice-juice-juice (match) 
orange-juice (match) 
+0

Z jakim językiem współpracujesz? Również "sok pomarańczowy" powinien się zgadzać, czy nie? – gnarf

Odpowiedz

-1

Coś (PHP)

$input = "The orange apple gave juice"; 
if(preg_match("your regex for validating") && !preg_match("/apple|orange|juice/", $input)) 
{ 
    // it's ok; 
} 
else 
{ 
    //throw validation error 
} 
+0

Z wyjątkiem tego, że pasuje do 'applejuice', a zatem powoduje błąd sprawdzania poprawności. – gnarf

7

Jeśli naprawdę chcesz to zrobić za pomocą jednego wyrażenia regularnego, można znaleźć lookaround pomocny (szczególnie negatywny uprzedzona w tym przykładzie). Regex napisany dla Ruby (niektóre implementacje mają różną składnię lookarounds):

rx = /^(?!apple$|orange$|juice$)/ 
1

Brzmi jak chcesz leczyć łącznik jako znak słowny.

3

Zauważyłem, że apple-juice powinien być zgodny z Twoimi parametrami, ale co z apple juice? Zakładam, że jeśli sprawdzasz poprawność apple juice nadal chcesz, aby się nie udało.

Tak - pozwala zbudować zestaw znaków liczyć jako „granicy”:

/[^-a-z0-9A-Z_]/  // Will match any character that is <NOT> - _ or 
         // between a-z 0-9 A-Z 

/(?:^|[^-a-z0-9A-Z_])/ // Matches the beginning of the string, or one of those 
         // non-word characters. 

/(?:[^-a-z0-9A-Z_]|$)/ // Matches a non-word or the end of string 

/(?:^|[^-a-z0-9A-Z_])(apple|orange|juice)(?:[^-a-z0-9A-Z_]|$)/ 
    // This should >match< apple/orange/juice ONLY when not preceded/followed by another 
    // 'non-word' character just negate the result of the test to obtain your desired 
    // result. 

W większości smaków regexp \b liczy się jako „granicy słowa” ale standard listy „znaków słownych” robi” t obejmują -, więc musisz utworzyć niestandardową. To może się równać z /\b(apple|orange|juice)\b/ jeśli nie próbowali złapać - także ...

Jeśli tylko testowanie testy „pojedyncze słowo” można przejść z dużo prostsze:

/^(apple|orange|juice)$/ // and take the negation of this... 
0

dostaje to niektóre drogi tam:

((?:apple|orange|juice)\S)|(\S(?:apple|orange|juice))|(\S(?:apple|orange|juice)\S) 
0
\A(?!apple\Z|juice\Z|orange\Z).*\Z 

będzie dopasować cały ciąg, chyba że składa się tylko z jednej z zakazanych słów.

Ewentualnie, jeśli nie używasz Ruby czy jesteś pewien, że struny zawierać żadnych podziałów wierszy lub ustawiono opcję ^ i $ nie zgadzają się na początki/końcach linii

^(?!apple$|juice$|orange$).*$ 

będzie również działać.

Powiązane problemy