簡體   English   中英

Javascript正則表達式匹配以某些字符結尾但不與這些字符的特定組合結束的字符串

[英]Javascript regex to match a string that ends with some characters but not with a particular combination of those

假設使用Javascript,我希望匹配以[abcde]*結尾的字符串,但不匹配abc

所以正則表達式應該匹配xxxaxxxbcxxxabd而不是xxxabc

我完全糊塗了。

編輯:由於某種原因,我必須使用正則表達式, if (str.endsWith("abc"))我不能做某事

解決方案很簡單:使用否定前瞻:

(?!.*abc$)

這斷言字符串不以abc結尾。

你提到你還需要字符串以[abcde]*結尾,但*表示它是可選的,所以xxx匹配。 我假設你真的想要[abcde]+ ,這也只是意味着它需要以[abcde]結尾。 在這種情況下,斷言是:

(?=.*[abcde]$)(?!.*abc$)

regular-expressions.info為正負lookarounds教程。


我不願意提供實際的Javascript正則表達式,因為我不熟悉該語言(盡管我確信斷言,如果支持,將起作用 - 根據regular-expressions.info ,Javascript支持正面和負面的預測)。 感謝Pointy和Alan Moore的評論,我認為正確的Javascript正則表達式是這樣的:

var regex = /^(?!.*abc$).*[abcde]$/;

請注意,此版本(歸功於Alan Moore)不再需要積極的前瞻性。 它只匹配.*[abcde]$ ,但首先斷言^(?!.*abc$)

問題沒有正確定義,或者每個人都忽略了一個簡單的答案。

var re = /abc$/;

!re.test("xxxa");    // pass
!re.test("xxxbc");   // pass
!re.test("xxxabd");  // pass
!re.test("xxxabc");  // fail

所有這些都以/[abcde]* /結尾

首先,請注意每個字符串以[abcde]*結尾,因為它允許零寬度。 因此,我們真的只是在尋找匹配不以abc結尾的字符串的正則表達式。 簡單。

([^c]|[^b]c|[^a]bc)$

那是不是c東西,不是b后跟c東西,或者不是bc后面的東西,以及那些選項中的任何a ,然后是字符串的結尾。

只想對@maček說你回答簡單明了! 在開始但我真的希望not運算符在regexp中,所以我可以使用它與例如: Array::someArray::filterArray::findArray::findIndex並且無需創建函數或一個詭計循環

這是一個例子:

 var items = ["ja", "ka", "mf", "bg", "vb", "b"] var regex = /^((?!a$|b$).)*$/; // match a string that doesn't end with a or b var matched = items.filter(RegExp.prototype.test, regex); alert(matched); // result: ["mf", "bg"] 

嗯......

var regex = /(ab[abde]|[abcde])$/; // wrong

也許? 等不 堅持,稍等:

var regex = /(ab[abde]|([^a].|.[^b])[abcde]|\b.?[abcde])$/;

那么“ab”后跟“a”,“b”,“d”或“e”; 或任何兩個字符的序列,其中第一個字符不是“a”或第二個字符不是“b”,后面跟着“a”到“e”; 或任何字邊界后跟任何字符(可能)后跟“a”到“e”。 最后一個條款是處理短字符串; 這是一種欺騙,但在這種情況下它是有效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM