2016-06-01 75 views
0

我想寫一個正則表達式:正則表達式。只有一個點

Pattern pattern2 = Pattern.compile("^([a-zA-Z0-9_'.-]{2,15})$"); 
Matcher matcher2 = pattern2.matcher(username); 

它應該做的是:

- all letters are allowed 
- all digit are allowed 
- symbols such as _'- are allowed 

我想補充一點,只有一個點是允許的。

user.name  ok 
use.rna.me  not ok 

非常感謝您的幫助!

+0

與{2,15}我的意思是用戶名必須是大於2小於15 – PaulStrom

回答

1

你可以嘗試負前瞻

String p = "use.rname"; 
    System.out.println(p.matches("(?!.*?\\..*?\\..*)([a-zA-Z0-9_'.-]{2,15})")); 

O/P:

"use.rname" ==> true 
"use.rname.xyz" ==> false 
2

可以實現與在開始掛靠在先行:

"^(?=[^.]*\\.[^.]*$)[a-zA-Z0-9_'.-]{2,15}$" 
    ^^^^^^^^^^^^^^^^^^ 

此外,您還可以使用\w代替[a-zA-Z0-9_](如果不添加(?U)在線修改或Pattern.UNICODE_CHARACTER_CLASS標誌):

"^(?=[^.]*\\.[^.]*$)[\\w'.-]{2,15}$" 

但是,上面的模式將需要字符串中的1個點。 如果不需要的點,反向的要求:如果2點是本失敗比賽:

"^(?![^.]*\\.[^.]*\\.)[\\w'.-]{2,15}$" 
    ^^^^^^^^^^^^^^^^^^^^ 

圖案的詳細資料

  • ^ - 串
  • (?![^.]*\\.[^.]*\\.)的開始 - 如果從一開始就有除.之外的0+個字符,則會出現否定性的前瞻,然後是.,然後是0+的其他字符從頭開始爲.,然後是.(注意,這可以縮寫爲(?!(?:[^.]*\\.){2})。
  • [\\w'.-]{2,15} - 2至15個字符,或者是一個字([a-zA-Z0-9_])或
  • .或連字符
  • $ - 字符串的結尾。
+0

看起來我已經完成了。如果有任何不清楚或缺失的情況,請隨時聯繫我。正則表達式演示可用[在這裏](https://regex101.com/r/iL0rO8/1)。另外,我會在實際代碼中使用'\\ A'來代替'^'和'\\ z',而不是'$'。另外,值得注意的是*儘管*字符類末尾的連字符不必逃避,但有些人認爲如果其他不太正則表達式的開發人員將要脫離它仍然是一個好主意以支持未來的正則表達式。 –

1

您可以用

^(?=.{2,15}$)[\w-']*\.?[\w-']*$ 

首先做的是確保整個表達式是長2-15個字符以積極的前瞻。然後它匹配的任何數量的word character S(a-zA-Z0-9_),接着是可選點,並隨後再次通過任何數量的word character第錨點(^ - 行首,$ - 行尾)確保沒有別的東西存在。

相關問題