2

我有一个/\W/i匹配所有非字母数字字符的 Perl 正则表达式,但它也匹配我想忽略的空格。如何让它匹配除空格以外的非字母数字字符?

4

3 回答 3

14

你可以使用

/[^\w\s]/

这匹配所有非单词字符 (\w) 和非空格 (\s)。

编辑:

/[^\w ]/

如果您只想忽略空格(不是所有空格)。

更新:

i由于不需要而被删除(请参阅几条评论)。

于 2010-10-20T00:14:55.363 回答
8

对于大多数目的,[^\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.

于 2010-10-20T03:33:31.237 回答
2
[^\p{Alnum}\d ] # NOT alnum or space
于 2010-10-20T05:13:53.647 回答