【发布时间】:2012-03-06 22:11:52
【问题描述】:
我正在尝试构建一个模式以便在验证中使用。
我的目标是让第一个字符是字母或数字,其余的都是任何字符。
i.ex:
- A'r4nd0m!
- 9!h3ll0.
- b1llin6s
我想到了:[a-zA-Z0-9_/][.*]++
解决办法是什么?
谢谢!
【问题讨论】:
-
字母或数字是
[\pL\pN]。
我正在尝试构建一个模式以便在验证中使用。
我的目标是让第一个字符是字母或数字,其余的都是任何字符。
i.ex:
我想到了:[a-zA-Z0-9_/][.*]++
解决办法是什么?
谢谢!
【问题讨论】:
[\pL\pN]。
如果第一个数字是数字或字母,则为 ^[A-Za-z0-9]。 (^ 匹配字符串的开头。)对于其余部分,简单的 .* 就足够了,所以你有 ^[A-Za-z0-9].*。
【讨论】:
.* 是多余的。
你可以稍微精简一下你的正则表达式:
^[a-zA-Z0-9].*
以字母/数字开头,可以是任意长度或后面的任意字符。
【讨论】:
.* 完全是多余的,因此具有误导性。其次,一个字母或一个数字是[\pL\pN],任何时候你发现自己写了一个明确的范围,你几乎肯定做错了什么。
您必须使用/^/ 将您的正则表达式锚定在字符串的开头。你的字符类[a-zA-Z0-9_/] 也匹配下划线和斜线:这是你想要的吗?此外,[.*]++ 匹配一个或多个点或星号,而结尾的 + 多余地重复了量词。
由于字符串的其余部分可以是“任何东西”,因此匹配它没有意义,并且
/^[A-Za-z0-9]/
会很好。
【讨论】:
\pL 和\pN 匹配的(国际)字符比[A-za-z] 和[0-9] 匹配的字符多得多,而且这种行为可能不可取。
\pL。规范要求提供一个数字;一个数字是\pN。我试图从 19 世纪消除愚蠢的打字机心态。没有国际化的性格。
正如我所评论的,字母或数字是[\pL\pN]。因此,以其中一个开头的字符串将匹配模式
/^[\pL\pN]/
【讨论】:
/u。 Perl 当然没有这样的错误。
^。那么,您的字符串现在是否检查字符串中的第一个字符?