2014-12-02 80 views
0

我想檢查一個字符串是否具有指定的結構。我認爲正則表達式是測試字符串的最好方法,但我從來沒有使用過正則表達式,並且很遺憾不知道它是如何工作的。我看了一些關於stackoverflow的解釋,但我找不到正確的解釋如何創建正則表達式。爲指定的字符串創建正則表達式模式

我的字符串從DataMatrix掃描儀中返回。例如

String contained = "~ak4,0000D" 

現在我想測試這個字符串,如果它匹配來自正則表達式的模式。

該字符串每次都以「〜」開頭。

之後,在這個例子中「ak」後面有兩個下面的外形特徵。

此後,出現一個六字符長度值「4,0000」。這裏的主要問題是,因爲逗號可以在這個值的任何位置,但逗號必須包含在其中。例如它可以是「,16000」或「150,00」或「2,8000」。

在最後一個位置必須有一個包含大寫字母的字符A B C D E F G H J K L M。

我希望你們中的一些人能幫助我。

回答

1

正則表達式將爲~[a-z]{2}(?=[\d\,]{6})((\d)*\,(\d)*)[A-H|J-M]{1}$您可以創建並測試表達式here

boolean isMatch(String STRING_YOU_WANT_TO_MATCH) 
{ 
    Pattern patt = Pattern.compile(YOUR_REGEX_PATTERN); 
    Matcher matcher = patt.matcher(STRING_YOU_WANT_TO_MATCH); 
    return matcher.matches(); 
} 
+0

'[A-M]'不匹配OP的請求。 'A B C D E F G H J K L M' – 2014-12-02 14:28:53

+0

@Pedro謝謝,看我的編輯。 – RaviVadera 2014-12-02 14:30:56

+0

'[\ d | \,]'也和管道匹配,'[\ d | \,] {6}'也只匹配6個數字。 – 2014-12-02 14:39:16

0
~[a-z]{2}[\d|\,]{6}[A-M] 

我在正則表達式無親,雖然,但我用這個網站,每次來建立我的模式:

RegExr

使用它像這樣在你的代碼:

Pattern pattern = Pattern.compile(yourPatternAsAString); 
Matcher matcher = pattern.matcher(yourInputToMatch); 
if(matcher.matches()) { 
    // gogogo 
} 
+1

使用Ravis交正確圖案) – cgew85 2014-12-02 14:31:30

1

有一件事你需要知道的正則表達式是他們是一個家庭事情,而不是一個具體的事情。有相當多的不同但相似的正則表達式語言,支持它們的設施從編程語言到編程語言都有所不同。

這裏是一個正則表達式模式將在大多數的正則表達式語言的工作,以配合您的字符串:

"^~[a-z][a-z]((,[0-9][0-9][0-9][0-9][0-9])|([0-9],[0-9][0-9][0-9][0-9])|([0-9][0-9],[0-9][0-9][0-9])|([0-9][0-9][0-9],[0-9][0-9])|([0-9][0-9][0-9][0-9],[0-9])|([0-9][0-9][0-9][0-9][0-9],))[A-HJ-M]$" 

的「^」錨定模式字符串的開頭,而「$」之錨結尾,以便模式必須匹配整個字符串而不是子字符串。用方括號括起來的字符表示「字符類」恰好與一個字符集中的一個字符匹配,兩個字符之間用' - '分隔,表示一系列字符。 '|'分開選擇,括號用於分組子模式。對於一些正則表達式引擎,括號和'\'符號需要通過前面的'\'字符轉義以具有這些特殊含義而不是表示自己。

一個更有效的正則表達式語言可以使它大大簡化;例如:

"^~[a-z]{2}[0-9,]{6}(?<=[a-z][0-9]*,[0-9]*)[A-HJ-M]$" 

的量詞「{2}」和「{6}」指明的是:以上子模式必須與指定的次數(而不是一次),並且量詞匹配「*」表示前面的子模式可以匹配任意次數,包括零。此外,「(?< = ...)」是一個零長度後顧斷言,它測試輸入的前幾個字符是否與給定的子模式相匹配(除了已經匹配前一個子模式);字符還必須匹配後續的子模式(它會消耗它們)。 '。'元字符和'*'量詞在幾乎所有的正則表達式語言中都得到支持,但斷言和大括號量詞不太受到廣泛支持。不過,Java和Perl的正則表達式語言都會理解這種模式。

+0

該表達式允許儘可能多的數字。 – RaviVadera 2014-12-02 14:42:52

+0

@RaviVadera,夠公平的。通過交換斷言的內容和下面的子模式來修復。 – 2014-12-02 14:48:09

+0

非常感謝這個正則表達式的詳細解釋。我非常喜歡你爲此付出的努力。它讓我理解了正則表達式。 – broesel001 2014-12-02 14:57:32

1

你需要使用像下面這樣的積極的基於lookahead的正則表達式。

System.out.println("~ak4,0000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~fk,10000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~jk400,00D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~ak4,0000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~fk10000,D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~jk400,00I".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~ak40000,Z".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~fky,10000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~,jk40000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 

輸出:

true 
true 
true 
true 
true 
false 
false 
false 
false 
+0

你不需要爲此提供一個前瞻斷言,但它確實很方便。 – 2014-12-02 14:54:30

+0

你能不能提供一個答案沒有lookarounds。 – 2014-12-02 15:31:07

+0

我確實提供了它。在發佈答案之前,甚至。看看我的答案。你甚至不需要依賴枚舉量詞,順便說一下,一些正則表達式引擎不能處理。 – 2014-12-02 15:42:29