正则表达式,不允许在末尾包含特殊字符,包括下划线和仅3个字符限制

时间:2017-03-17 07:03:50

标签: java android regex special-characters pcre

  1. 我的要求是"姓名开始,带有字母,并且应该至少有三个字符,并且不能结束带有特殊字符,但特殊的字符可以出现在中间。"它最后也不应该允许下划线。
  2. 我正在使用的正则表达式[a-zA-Z][\w]{1,}.*[\w]
  3. 上述正则表达式最终不会将下划线(_)识别为特殊字符。
  4. 当我输入" sss _"它没有认识到。
  5. 当我输入" sss @"或" sss#"或" sss $"它的识别。

  6. 预期结果" test"," test @ test"," test_test"," tes"

  7. 意外结果" tes @"," test _"," te"

2 个答案:

答案 0 :(得分:1)

更新2:

由于您现在说它在Android中,请删除(?U)。所有速记字符类在Android正则表达式中都已识别Unicode:

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

并将其与matches()一起使用。

更新回答

使用

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

请参阅online Java demo

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; 
    } 
}

请注意,在使用String#matches()时甚至不需要锚点,因为默认情况下此方法会锚定模式。

[\\W_]将匹配任何特殊字符包含 a _

原始答案

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

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

您可以在JS或任何其他不支持Unicode的引擎中使用[^\W\d_]而不是[a-zA-Z],而只需要处理ASCII字母。

支持Unicode的等效项

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

此处,\p{L}匹配任何Unicode字母。

<强>详情:

  • ^ - 字符串锚的开始
  • [^\W\d_]+ / \p{L}+ - 一个或多个字母
  • (?:_[^\W\d_]+)* - 零次或多次出现:
    • _ - _
    • [^\W\d_]+ / \p{L}+ - 一个或多个字母
  • $ - 字符串锚定结束。

请参阅this regex demo

答案 1 :(得分:0)

试试这个正则表达式

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