14

我如何匹配除PHP 中+_*&^%$#@!~的字符之外的所有“特殊”字符(如 ) ?-

我知道这\W将匹配所有“特殊”字符,包括-.

考虑到 Unicode 字母有什么建议吗?

4

3 回答 3

52
  • [^-]不是你想要的特殊字符
  • [\W]如你所知,都是特殊字符
  • [^\w]都是特殊字符 - 听起来公平吗?

因此[^\w-],两者的组合是:所有“特殊”字符但没有-.

于 2012-03-15T20:06:30.660 回答
6
  • \pL匹配任何具有 UnicodeLetter字符属性的字符,这是一个主要的通用类别组;也就是说,它匹配[\p{Ll}\p{Lt}\p{Lu}\p{Lm}\p{Lo}].
  • \pN匹配任何具有 UnicodeNumber字符属性的字符,这是一个主要的通用类别组;也就是说,它匹配[\p{Nd}\p{Nl}\p{No}].
  • 请注意,UnicodeAlphabetic字符属性还包括某些组合标记,例如 U+0345 ◌ͅ ᴄᴏᴍʙɪɴɪɴɢ ɢʀᴇᴇᴋ ʏᴘᴏɢᴇɢʀᴀᴍᴍᴇɴɪ。我建议您还包括\pM,它与具有 UnicodeMark字符属性的任何字符匹配,这是一个主要的通用类别组;也就是说,它匹配[\p{Mn}\p{Me}\p{Mc}].
  • 字符 U+002D ʜʏᴘʜᴇɴ-ᴍɪɴᴜꜱ 可能就是-您所指的。
  • 请注意,尽管 Unicode v6.1 有27个具有 UnicodeDash字符属性的字符,包括 U+2010 ʜʏᴘʜᴇɴ、U+2013 ᴇɴ ᴅᴀꜱʜ、U+2014 ᴇᴍ ᴅᴀꜱʜ 和 U+2212 ᴍɪɴᴜ.ꜱ ꜱ等常见字符 不管你真的想包括还是排除那些,我不知道。

鉴于所有这些,您不太可能想要类似的东西:

[^\pL\pN\pM\x2D\x{2010}-\x{2015}\x{2212}]
于 2012-03-16T00:56:20.717 回答
4

你可以试试这个模式

([^a-zA-Z-])

这应该匹配所有不是a-z的字符和-

于 2012-03-15T19:52:01.073 回答