我有一个/\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