我有一个/\W/i匹配所有非字母数字字符的 Perl 正则表达式,但它也匹配我想忽略的空格。如何让它匹配除空格以外的非字母数字字符?
3 回答
你可以使用
/[^\w\s]/
这匹配所有非单词字符 (\w) 和非空格 (\s)。
编辑:
/[^\w ]/
如果您只想忽略空格(不是所有空格)。
更新:
i由于不需要而被删除(请参阅几条评论)。
对于大多数目的,[^\w\s]应该足够了。它只匹配一个既不是“alphanumunder”也不是 PerlSpace 的字符。
这几乎但不完全像说它匹配任何既不\p{Alphabetic}是也不\p{Digit}是下划线(LOW LINE)也不是\p{WhiteSpace},除了关于 chr 11,垂直制表符的狡猾,因为虽然它被考虑,但它没有被考虑。\s\p{WhiteSpace}
那个小\s速记真的是意思\p{PerlSpace},不是 \p{WhiteSpace}。和\p{Space}是一样的\p{WhiteSpace}。唯一的\S字符(意思,不是\s)也是\p{Space}那个讨厌的垂直制表符。请注意,垂直制表符包含在 中\v,这意味着[\v\h]对于任何垂直或水平空白区域,都与\p{Space}, not相同\s。
我现在将更准确地了解字母数字。为简单起见,我将讨论正匹配。反转逻辑以获得否定匹配应该很容易。
如果“字母数字”是指字母或数字,您可能应该使用准确表示该含义的属性。\pL是 的缩写\p{Letter},它可能涵盖了那些。所有字母都是字母,但有些字符 还不是\p{Alphabetic},\p{Letter}如罗马数字、带圆圈的字母和各种变音符号。
对于数字,问题是您是要仅包含数字,还是其他数字都可以。 \pN是 的缩写\p{Number},但其中包含很多非数字。 \d是 的缩写\p{Nd},而那又是 的缩写\p{Decimal_Number},尽管\p{Digit}也可以正常工作。非数字的数字包括罗马数字、粗俗分数、上标数字和带圆圈的数字。
从 Perl 5.11 之后的某个时间开始,您可以使用诸如\p{POSIX_Digit}for nothing but之类的属性[0-9],\p{POSIX_Alpha}仅用于字母,也\p{POSIX_Alnum}可以用于两者。还有一个版本或更好的版本,仅\p{POSIX_Space}涵盖字符 9-13 加上 32 ,完全忽略了稍后出现的其他 20 个空白字符。
在此之前,您仍然可以通过使用将匹配限制为仅 ASCII 的前瞻断言将匹配限制在 ASCII 范围内,使用/(?=\p{ASCII})[\p{Alpha}\p{Digit}]/, 尽管将字符限制为 7 位是非常糟糕的最后一千年。
我可能会让他们使用罗马数字,但不使用异国情调的变音符号,所以只使用/[\p{Letter}\p{Digit}]/,/[\pL\d]/如果您愿意,可以缩短到。
现在,您将空白添加到带有\s或稍宽的\p{Space},给予/[\p{Letter}\p{Digit}\p{Space}]/。我也会以这种形式保留它,因为我认为您的意思更清楚。
要否定这一点,您可能会考虑在它前面加上前缀!,但这并不完全相同,因为空字符串会匹配。所以你应该在字符类的开头放一个插入符号来补充集合,使它成为/[^\p{Letter}\p{Digit}\p{Space}]/.
您不能像使用单个属性那样将感觉\p转变为您可以使用的方式,因为会得到非数字的字母字符、非数字的(空白)空格字符、非空格的数字字符等。\P/[\P{Letter}\P{Digit}\P{Space}]/
不过,仍然没有理由使用/i.
[^\p{Alnum}\d ] # NOT alnum or space