【问题标题】:allow parentheses and other symbols in regex在正则表达式中允许括号和其他符号
【发布时间】:2013-09-06 14:13:07
【问题描述】:

我已经制作了这个正则表达式:

^[a-zA-Z0-9_.-]*$

支持:

letters [uppercase and lowercase]
numbers [from 0 to 9]
underscores [_]
dots [.]
hyphens [-]

现在,我想添加这些:

spaces [ ]
comma [,]
exclamation mark  [!]
parenthesis [()]
plus [+]
equal [=]
apostrophe [']
double quotation mark ["]
at [@]
dollar [$]
percent [%]
asterisk [*]

例如,这段代码只接受上面的一些符号:

^[a-zA-Z0-9 _.,-!()+=“”„@"$#%*]*$

返回:

警告:preg_match():编译失败:偏移 16 处的字符类范围乱序

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    确保在字符类的开头或结尾放置连字符-,否则需要转义。试试这个正则表达式:

    ^[a-zA-Z0-9 _.,!()+=`,"@$#%*-]*$
    

    还要注意,因为* 它甚至会匹配一个空字符串。如果您不想匹配空字符串,请使用+:

    ^[a-zA-Z0-9 _.,!()+=`,"@$#%*-]+$
    

    或者更好:

    ^[\w .,!()+=`,"@$#%*-]+$
    

    测试:

    $text = "_.,!()+=,@$#%*-";
    if(!preg_match('/\A[\w .,!()+=`,"@$#%*-]+\z/', $text)) {
       echo "error.";
    }
    else {
       echo "OK.";
    }
    

    打印:

    OK.
    

    【讨论】:

      【解决方案2】:

      连字符被视为范围标记 - 当它看到 ,-! 时,它认为您要求的字符集中在 ,! 之间的所有字符的范围(即与A-Z 有效。这不是你想要的。

      要么确保连字符是字符类中的最后一个字符,就像以前一样,要么使用反斜杠对其进行转义。

      我还要指出,您使用的引号字符 “”„ 是扩展字符集的一部分,与基本的 ASCII 引号 "' 不同。您可能希望将这两组都包含在您的模式中。如果您确实需要在模式中包含非 ASCII 字符,您还应该在模式末尾添加 u 修饰符,以便它正确选择 unicode 字符。

      【讨论】:

        【解决方案3】:

        尝试转义您的正则表达式:[a-zA-Z0-9\-\(\)\*]

        检查是否对您有帮助:How to escape regular expression special characters using javascript?

        【讨论】:

        • 当新添加的字符出现在字符类中时,不需要转义(它们确实如此)。唯一有问题的字符是连字符,其他响应者已经解释了如何处理。
        • 哦,可能还有花哨的引号 (“”„)。但是Spudley's answer 处理这些。
        【解决方案4】:

        在字符类[...] 中,连字符- 具有特殊含义,除非它是第一个或最后一个字符,因此您需要对其进行转义:

        ^[a-zA-Z0-9 _.,\-!()+=“”„@"$#%*]*$
        

        其他字符都不需要在字符类中转义(] 除外)。您还需要转义指示字符串的引号。例如

        '/[\']/'
        "/[\"]/"
        

        【讨论】:

          【解决方案5】:

          试试这个

          ^[A-Z0-9][A-Z0-9*&!_^%$#!~@,=+,./\|}{)(~`?][;:\'" "-]{0,8}$

          使用这个link to test

          诀窍是我将括号和其他大括号倒序排列,从而解决了一些问题。而对于方括号,你必须将它们转义

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-19
            • 2016-12-02
            • 2020-10-29
            • 2015-12-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多