![](/img/trans.png)
[英]javascript check if string starts with some characters and remove those characters
[英]Javascript regex to match a string that ends with some characters but not with a particular combination of those
假設使用Javascript,我希望匹配以[abcde]*
結尾的字符串,但不匹配abc
。
所以正則表達式應該匹配xxxa
, xxxbc
, xxxabd
而不是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::some
, Array::filter
, Array::find
, Array::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.