我需要一个正则表达式来匹配UTF-8字母和数字、破折号(-
),但不匹配下划线(_
)。我尝试了以下这些无效的正则表达式:
([\w-^_])+
([\w^_]-?)+
(\w[^_]-?)+
\w
是 [A-Za-z0-9_]
的速记符号,但如果设置了 u
修饰符,它也会匹配UTF-8字符。
有人能帮我解决这个问题吗?
我需要一个正则表达式来匹配UTF-8字母和数字、破折号(-
),但不匹配下划线(_
)。我尝试了以下这些无效的正则表达式:
([\w-^_])+
([\w^_]-?)+
(\w[^_]-?)+
\w
是 [A-Za-z0-9_]
的速记符号,但如果设置了 u
修饰符,它也会匹配UTF-8字符。
有人能帮我解决这个问题吗?
试试这个:
(?:[\w\-](?<!_))+
它会对所有被编码为\w(或破折号)的字符进行简单匹配,并使用零宽度回顾后发现刚才匹配的字符不是下划线。
否则,你可以选择这个:
(?:[^_\W]|-)+
这是一种更加基于集合的方法(注意大写字母W)。
好吧,在 PHP 中,我用 PCRE 玩了很多 Unicode 的花样:D Peekaboo 说有一个简单的解决方案可用:
[\p{L}\p{N}\-]+
\p{L} 匹配任何Unicode字符,都可以被视为字母(注意:不包括单词字符,因此不包括下划线),而 \p{N} 匹配任何看起来像数字的字符(包括罗马数字和更多奇特的字符)。
\- 就是一个转义的破折号。虽然不是严格必要的,但我倾向于在字符类中转义破折号...请注意,Unicode 中有几十种不同的破折号,因此会出现以下版本:
[\p{L}\p{N}\p{Pd}]+
“Pd”指的是标点破折号,其中包括但不限于我们的减号破折号。请注意,这里没有下划线。