我理解只包含數字的正則表達式的過程,但是如何添加另一個條件使其不能包含某個子串。例如,匹配僅包含數字但不包含子字符串456
的輸入的正則表達式。正則表達式匹配不包含其他模式的模式
鑑於此輸入(其中<empty>
爲空字符串""
):
0
1456
<empty>
12345689
1010101
abc
這些只有這些應該matche:
0
<empty>
1010101
有人能解釋的正則表達式嗎?
我理解只包含數字的正則表達式的過程,但是如何添加另一個條件使其不能包含某個子串。例如,匹配僅包含數字但不包含子字符串456
的輸入的正則表達式。正則表達式匹配不包含其他模式的模式
鑑於此輸入(其中<empty>
爲空字符串""
):
0
1456
<empty>
12345689
1010101
abc
這些只有這些應該matche:
0
<empty>
1010101
有人能解釋的正則表達式嗎?
我認爲這是你在找什麼:
public static void main(String[] args) {
String regex = "^((?!456)\\d)*$";
String test = "123";
String test2 = "456";
String test3 = "asdf123";
String test4 = "test456asdf";
System.out.println(test.matches(regex)); // True
System.out.println(test2.matches(regex)); // False
System.out.println(test3.matches(regex)); // False
System.out.println(test4.matches(regex)); // False
}
即:
這裏有一個鏈接到fiddle,您可以在其中測試epsilon角色。
我認爲這個方法沒有任何「花哨」的正則表達式特徵,比如負向視圖。
^([0-35-9]*|4[0-46-9]|45[0-57-9]|4$|45$)*$
即:
這符合正則表達式作爲有限狀態機的屬性。我們明確地處理了三個州 - (「未見過4」,「看過4」,「看過45次」)。如果我們希望我們的「不匹配」字符串是「4567」,我們必須明確添加另一個狀態,使模式更長,狀態機更大。
這是否符合您的需求取決於測試的目的 - 熟悉Java的正則表達式的高級特性,或者普遍應用正則表達式的能力(例如基本的grep
,bash
)。
消極的lookaheads,讓你表達更簡潔。
^((!?456)\d)*$
即(與它周圍的開始和結束錨),零個或多個重複單字符圖案的:(!?456)\d
這意味着「沒有的456
(向前看而不實際消耗)開始和相匹配的數字字符。」
要處理這個問題,正則表達式引擎只需要在當前字符前面查看3個字符,這是滿足要求的一種有效的單向方法。
你的正則表達式是什麼? – user1211
這可以很難做到。但你爲什麼想要?編寫「正常」代碼來進行檢查要容易得多。 – slim
我準備進行測試,這是前幾年測試的問題。明確聲明必須寫在正則表達式 – unity1989