2016-04-25 23 views
0

我需要根據給定的條件來驗證輸入,Java的正則表達式的最大長度與一個連字符

- 必須是20個字符,總長度 負一第五位必須是英文字母 -remaining應該是數字,但必須存在一個僅在數字之間出現的連字符( - )。 我有這樣

([a-zA-Z]){5}[0-9]+([-]){15} 

的正則表達式,但它允許在最後的連字符,以及和沒有連字符甚至接受。

+0

那麼你爲什麼不把一個連字符*內*號的格局? –

+0

我認爲在這裏嘗試一個非正則表達式的解決方案會更簡單。 – Maroun

+0

是的,我確實在連字符裏面,但效果是一樣的。我剛剛添加了上面的那個,因爲那是我的最後一次測試。 – user3028989

回答

2

您可以使用

^[a-zA-Z]{5}(?=[0-9-]{15}$)[0-9]+-[0-9]+$ 

regex demo

詳細

  • ^ - 匹配5個字母
  • (?=[0-9-]{15}$) - - 字符串的開始
  • [a-zA-Z]{5}符合要求的字符串的其餘部分應爲15個字符長
  • [0-9]+-[0-9]+ - 1+數字後跟連字符,後跟1+數字
  • $ - 字符串的結尾(你可以用\z替換字符串的結尾最後一個換行符之前排除匹配)

如果使用.matches(),你可以省略外錨。

Java test

String pat = "[a-zA-Z]{5}(?=[0-9-]{15}$)[0-9]+-[0-9]+"; 
System.out.println("abcde123456-89".matches(pat)); // true 
System.out.println("abcde-12345689".matches(pat)); // false 
System.out.println("abcde12345689-".matches(pat)); // false 
System.out.println("abcde12345689-12".matches(pat)); // false 
0

剛剛添加的非正則表達式的角度位置:

if (str.length() != 20) { 
    return false; 
} 
for (int i = 0; i < 5; ++i) { 
    if (!Character.isAlphabetic(str.charAt(i)) { 
    return false; 
    } 
} 
boolean hyphenFound = false; 
for (int i = 5; i < 20; ++i) { 
    char ch = str.charAt(i); 
    if (ch == '-') { 
    hyphenFound = true; 
    } else if (!Character.isDigit(ch) && !Character.isAlphabetic(ch)) { 
    return false; 
    } 
} 
return hyphenFound; 
相關問題