2011-04-08 63 views
0

我目前使用下面的正則表達式的Java正則表達式:我需要

^[a-zA-Z]{0,}(\\*?)?[a-zA-Z0-9]{0,} 

檢查字符串在任何地方開始以字母字符和字母數字字符結束並且有星號(*)字符串,但最多隻有一次。這裏的問題是,如果給定的字符串仍然通過,如果它以數字開頭但沒有*,則應該失敗。我該如何重寫正則表達式才能使這種情況失敗?

ex。

 
TE - pass 

*TE - pass 

TE* - pass 

T*E - pass 

*9TE - pass 

*TE* - fail (multiple asterisk) 

9E - fail (starts with number) 

編輯: 對不起引進後期編輯,但我還需要確保字符串爲8個字符以內,我可以包括在正則表達式中呢?或者我應該檢查正則表達式驗證後的字符串長度?

+0

我只是檢查驗證之前或之後的長度。 – 2011-04-08 19:47:08

回答

4

這通過你的例子:

"^([a-zA-Z]+\\*?|\\*)[a-zA-Z0-9]*$" 

It says: 
    start with: [a-zA-Z]+\\*? (a letter and maybe a star) 
       | (or) 
       \\* a single star 
    and end with [a-zA-Z0-9]* (an alphanumeric character) 

代碼來測試它:

public static void main(final String[] args) { 
    final Pattern p = Pattern.compile("^([a-zA-Z]+\\*?|\\*)\\w*$"); 

    System.out.println(p.matcher("TE").matches()); 
    System.out.println(p.matcher("*TE").matches()); 
    System.out.println(p.matcher("TE*").matches()); 
    System.out.println(p.matcher("T*E").matches()); 
    System.out.println(p.matcher("*9TE").matches()); 
    System.out.println(p.matcher("*TE*").matches()); 
    System.out.println(p.matcher("9E").matches()); 
} 

每夜光雲,如果你允許字母數字的明星之前,然後使用此:

^([a-zA-Z][a-zA-Z0-9]*\\*?|\\*)\\w*$ 
+1

@NKCSS,它通過T * E就好了,但它在T9失敗* Z。把它改成'^([a-zA-Z] [a-zA-Z0-9] * \\ *?| \\ *)\\ w * $'應該可以做到。 – riwalk 2011-04-08 19:10:51

+0

刪除它,一定是已經把它添加到錯誤的正則表達式(這裏有很多問題:) :) – NKCSS 2011-04-08 19:12:35

+0

@Stargazer我讀它作爲所有的字母數字字符應該在星星之後,如果不是這樣的話,那麼是 – 2011-04-08 19:12:51

1

一種可能的方式是分離成2個條件:

^(?=[^*]*\*?[^*]*$)[a-zA-Z*][a-zA-Z0-9*]*$ 
  • (?=[^*]*\*?[^*]*$)部分也確保了至多一個*字符串英寸
  • [a-zA-Z*][a-zA-Z0-9*]*部分確保它以字母或*開頭,後跟字母數字或*
+0

好吧,它看起來像是在工作,但Eclipse說有非法逃跑後果,我應該在'*'之前加倍'\'嗎? – Erik 2011-04-08 19:06:55

+0

@Erik:是的。 [](http://。) – kennytm 2011-04-08 19:07:24

+0

好吧,看起來像是按照預期工作,謝謝 – Erik 2011-04-08 19:15:13

0

如果您只是將正則表達式分解爲幾個部分,例如一個用於開始和結束,另一個用於星號,則以後開發和維護可能會更容易。我不確定總體性能的影響是什麼,你會得到更簡單的表達式,但必須運行其中的一些。

0

查找了兩個可能的模式,一個以*開頭的,和一個帶有字母字符:

^[a-zA-Z][a-zA-Z0-9]*(\\*?)?[a-zA-Z0-9]*|\*[a-zA-Z0-9]* 
+0

正則表達式構造函數拋出異常: 解析「^ [a-zA-Z] [a-zA-Z0-9](\?)?[a-zA-Z0-9] | * [a-zA-Z0- 9]「 - 量詞{x,y}沒有任何內容。 – NKCSS 2011-04-08 19:10:11

+0

謝謝 - 沒有將它標記爲代碼,並且SO隱藏了一些字符。 – 2011-04-08 19:18:26

0

這個怎麼樣,它更容易閱讀:

boolean pass = input.replaceFirst("\\*", "").matches("^[a-zA-Z].*\\w$"); 

假設我沒有看錯,你想:

  1. 開始以字母字符
  2. 結束以字母數字字符
  3. 留出一個*爲清楚起見隨時隨地
0

^([a-zA-Z][a-zA-Z0-9]*\*|\*|[a-zA-Z])([a-zA-Z0-9])*$

圍繞下半年括號是,可以安全地排除。

+0

Eek ...剛剛意識到我的要求只有一顆星...挑戰 – riwalk 2011-04-08 19:09:43

+0

未能匹配T * M – NKCSS 2011-04-08 19:10:42

+0

編輯應該有這個工作現在 – riwalk 2011-04-08 19:13:34

0

這是一個艱難的(喜歡挑戰),但這裏是:

^(\*[a-zA-Z0-9]+|[a-zA-Z]+[\*]{1}[a-zA-Z]*)$ 

爲了符合T9 * Z,如在另一篇文章中有StarGazer712指出,我不得不將其更改爲:

^(\*[a-zA-Z0-9]+|[a-zA-Z]{1}[a-zA-Z0-9]*[\*]{1}[a-zA-Z0-9]*)$ 
0

這是Python的,它會需要一些按摩的Java :


>>> import re 
>>> p = re.compile('^([a-z][^*]*[*]?[^*]*[a-z0-9]|[*][^*]*[a-z0-9]|[a-z][^*]*[*])$', re.I) 
>>> for test in ['TE', '*TE', 'TE*', 'T*E', '*9TE', '*TE*', '9E']: 
... if p.match(test): 
... print test, 'pass' 
... else: 
... print test, 'fail' 
... 
TE pass 
*TE pass 
TE* pass 
T*E pass 
*9TE pass 
*TE* fail 
9E fail 

希望我沒有錯過任何東西。

0

最多隻有一個星號,任何地方的字母字符和任何地方的數字,但在開始時。

String alpha = "[a-zA-Z]"; 
    String alnum = "[a-zA-Z0-9]"; 

    String asteriskNone = "^" + alpha + "+" + alnum + "*"; 
    String asteriskStart = "^\\*" + alnum + "*"; 
    String asteriskInside = "^" + alpha + "+" + alnum + "+\\*" + alnum + "*"; 
    String yourRegex = asteriskNone + "|" + asteriskStart + "|" 
      + asteriskInside; 
    String[] tests = {"TE","*TE","TE*","T*E","*9TE","*TE*", "9E"}; 
    for (String test : tests) 
     System.out.println(test + " " + (test.matches(yourRegex)?"PASS":"FAIL"));