2013-12-18 62 views
2

我需要檢查字符串是否包含字母和數字的特定排列。檢查Java中字符串中特定符號的特殊排列

有效安排是例如:

X 
X-Y 
A-H-K-L-J-Y 
A-H-J-Y 

123 
12? 
12* 
12-17 

無效是例如:

-X-Y 
-XY 

*12 
?12 

我已用Java編寫的該方法來解決這個問題的(但我不有正則表達式的一些經驗):

public boolean checkPatternMatching(String sourceToScan, String searchPattern) { 

    boolean patternFounded; 

    if (sourceToScan == null) { 
     patternFounded = false; 
    } else { 
     Pattern pattern = Pattern.compile(Pattern.quote(searchPattern), 
      Pattern.CASE_INSENSITIVE); 
     Matcher matcher = pattern.matcher(sourceToScan); 
     patternFounded = matcher.find(); 
    } 
    return patternFounded; 
} 

我如何使用正則表達式實現此要求?

順便說一句:這是一個很好的解決方案來檢查一個字符串,它是否包含數字內容通過使用方法isNumeric從Java類的StringUtils?

//編輯

的聯繫,這是由管理員編輯包含的字符不是具體安排,但只有一個字符使用正則表達式在一般的外觀!

回答

7

,而試圖幫助,回答不斷變化的問題後好了,剛剛發現the same was asked yesterday,那OP doesn't accept answers to his questions ......所有我已經離開說的是晚安先生,祝你好運

第n答案如下:

第一圖案:[a-z](-[a-z])*:一個字母,可能跟隨多個字母,通過-分離。

第二圖案:\d+(-\d+)*[?*]*:一個數字,可能跟隨多個數字,通過-分離,並且可能與?*結束。

所以加入他們:^([a-z](-[a-z])*)|(\d+(-\d+)*[?*]*)$^$標記字符串的開始和結束。

很少的代碼更多的評論:你不需要使用Pattern.quote,你應該使用matches()代替find(),因爲字符串的find()回報true如果任何部分匹配的模式,並且要的整個字符串:

public static boolean checkPatternMatching(String sourceToScan, String searchPattern) { 
    boolean patternFounded; 

    if (sourceToScan == null) { 
     patternFounded = false; 
    } else { 
     Pattern pattern = Pattern.compile(searchPattern, Pattern.CASE_INSENSITIVE); 
     Matcher matcher = pattern.matcher(sourceToScan); 
     patternFounded = matcher.matches(); 
    } 
    return patternFounded; 
} 

這樣調用:checkPatternMatching(s, "^([a-z](-[a-z])*)|(\\d+(-\\d+)*[?*]*)$")

關於第二個問題,這就是的:

public static boolean isNumeric(final CharSequence cs) { 
    if (isEmpty(cs)) { 
     return false; 
    } 
    final int sz = cs.length(); 
    for (int i = 0; i < sz; i++) { 
     if (Character.isDigit(cs.charAt(i)) == false) { 
      return false; 
     } 
    } 
    return true; 
} 

所以,不,沒有錯吧,這是因爲它得到簡單。但是你需要在你的程序中包含一個外部的JAR,如果你只是想使用這樣一個簡單的方法,我覺得這是不必要的。

+0

謝謝!這種模式是否適用於表達式「X-Y」:[a-z](\ - [a-z]) – Marwief

+0

@Marwief是的,對於這種簡單的情況,您甚至可以刪除括號。它們用於重複使用' - [az]' –

+0

您對我的另一個問題有什麼看法?順便說一下:這是檢查字符串的一個很好的解決方案,它是否包含使用方法isNumeric的數字內容java類的StringUtils? – Marwief

1

我相信你應該首先刪除Pattern.quote()方法,因爲這會將輸入模式轉換爲字符串文字;而這些在你的上下文中並不是很有用。

,以配合信件有效的安排,這樣的事情應該工作:

^[a-z](?:-[a-z])*$ 

對於數字(如果我理解正確的規則):

^\\d+(?:[?*]|-\\d+)*$ 

如果要合併他們:

^(?:[a-z](?:-[a-z])*|\\d+(?:[?*]|-\\d+)*)$ 

我不熟悉Java本身,也不是isNumeric方法,對不起。


根據你的評論,如果你想接受*121?212*456,你可以使用:

^\\*?\\d+(?:[?*]\\d*|-\\d+)*$ 

然後將它添加到以前的正則表達式,像這樣:

^(?:[a-z](?:-[a-z])*|\\*?\\d+(?:[?*]\\d*|-\\d+)*)$ 
+0

@Mwwief是否「?? 12」有效? '1 *?2'有效嗎? '* 12?3'是否有效? – Jerry