【问题标题】:Regular expression for not allowing special chars at the end including underscore and with only 3 character limit不允许末尾包含下划线且仅限 3 个字符的特殊字符的正则表达式
【发布时间】:2017-08-08 15:18:33
【问题描述】:
  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”

【问题讨论】:

  • \w 匹配 _。替换为[^\W_] 以从\w 中“排除”(或称为“减去”)_。请注意,.* 匹配任何 0+ 字符(换行符除外)。
  • 里面有什么?只是字母? ASCII 还是 Unicode?哪个标签有效:JS 还是 PCRE ????
  • 是的,它可以工作,但如果我给例如 a_a、team_testing,它就不能工作。在这些情况下,它应该允许下划线。
  • 好的,所以规则是:letters + (_ + letters) *,对吗?现在,是 JS 还是 PCRE?它应该支持Unicode字母吗?
  • 它的 pcre.. 它也应该允许 unicode

标签: java android regex special-characters pcre


【解决方案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_] 将匹配任何特殊字符包括_。

原答案

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

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

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

识别 Unicode 的等效项:

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

这里,\p{L} 匹配任何 Unicode 字母。

详情:

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

见this regex demo。

【讨论】:

【解决方案2】:

试试这个正则表达式

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

【讨论】:

    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2017-08-15
    • 2015-10-06
    • 2021-10-02
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多