2017-03-17 42 views
1
  1. 我的要求是「名稱應該開始以字母表,應該有ATLEAST 字符和表達不能用特殊字符,但特殊字符可以在中間。「它最終也不應該允許下劃線。
  2. 正在使用的正則表達式[a-zA-Z][\w]{1,}.*[\w]
  3. 上面的正則表達式不承認下劃線(_)作爲特殊字符在最後。
  4. 當我鍵入「sss_」它不能識別。
  5. 當我輸入「sss @」或「sss#」或「sss $」來識別時。定期爲不允許使用特殊字符末包括下劃線和只有3個字符的限制

  6. 預期的結果 「測試」, 「測試@測試」, 「test_test」, 「TES」

  7. 意想不到的結果 「TES @」, 「TEST_」, 「TE」

+0

'\ w'一個'_'匹配。用'\ w'替換''''''替換''''從'\ w'中「排除」(或稱爲「減去」)。請注意'。*'匹配任何0+字符(除換行符外)。 –

+0

裏面有什麼?只是信件? ASCII還是Unicode?哪個標籤有效:JS或PCRE? –

+0

是的,它的工作,但如果我給像例如a_a,team_testing,它不工作。在這些情況下應該允許下劃線。 –

回答

1

更新2:

既然您現在說它是在Android中,請刪除(?U)。所有的速記字符類是已經支持Unicode的在Android正則表達式:

"\\p{L}+(?:[\\W_]\\p{L}+)*" 

而且隨着matches()使用它。

更新答案

使用

Boolean isValid = groupNameString.matches("(?U)\\p{L}+(?:[\\W_]\\p{L}+)*"); 

online Java demo。使用String#matches()時,因爲這種方法主播默認模式

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     System.out.println(validateName("Dąb_rośnie$gdzieś#tu")); 
     System.out.println(validateName("Some_string_here")); 
    } 
    private static boolean validateName(String name) { 
     if (name.matches("(?U)\\p{L}+(?:[\\W_]\\p{L}+)*")) { 
      return true; 
     } 
     return false; 
    } 
} 

注意,你甚至不需要錨。

[\\W_]將匹配任何特殊字符包括 a _

原來的答覆

要匹配letters +(_ + letters*模式,你可以使用

^[^\W\d_]+(?:_[^\W\d_]+)*$ 

相反的[^\W\d_],您可以在JS或任何其他引擎不是使用[a-zA-Z] Unicode識別,你只需要處理ASCII字母。

的Unicode的等價

^\p{L}+(?:_\p{L}+)*$ 

這裏,\p{L}匹配任何Unicode字母。

詳細

  • ^ - 字符串錨開始
  • [^\W\d_]+/\p{L}+ - 1個或多個字母
  • (?:_[^\W\d_]+)* - 零次或多個出現:
    • _ - 一個_
    • [^\W\d_]+/\p{L}+ - 1或多個字母
  • $ - 串錨的端部。

請參閱this regex demo

+0

評論是不適合擴展討論;這個談話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/138401/discussion-on-answer-by-wiktor-stribizew-regular-expression-for-not-allowing-spe)。 –

0

嘗試此正則表達式表達

^[A-z]+[^\`|\~|\!|\@|\#|\$|\%|\^|\&|\_|\*|\(|\)|\+|\=|\[|\{|\]|\}|\||\\|\'|\<|\,|\.|\>|\?|\/|\""|\;|\:|\s]+$ 
相關問題