2017-03-17 43 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]+$ 
相关问题