如何创建与空格以外的非字母数字字符匹配的Perl正则表达式?

时间:2010-10-20 00:08:10

标签: regex perl unicode character-properties non-alphanumeric

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

3 个答案:

答案 0 :(得分:14)

您可以使用

/[^\w\s]/

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

修改

/[^\w ]/

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

更新:

删除了i,因为它不需要(请参阅几条评论)。

答案 1 :(得分:8)

对于大多数用途,[^\w\s]应该足够了。这只匹配一个既不是“alphanum”也不是PerlSpace的角色。

除了关于chr 11的weaseling之外,几乎但不太喜欢说它匹配任何既不是\p{Alphabetic}也不\p{Digit},也不是下划线(LOW LINE)和\p{WhiteSpace}的东西。选项卡,因为被视为\s,但 被视为\p{WhiteSpace}

\s简写真的是menas \p{PerlSpace}不是 \p{WhiteSpace}\p{Space}\p{WhiteSpace}相同。唯一的\S字符(也就是\s)也是\p{Space},这是一个讨厌的垂直制表符。请注意,\v中包含垂直标签,因此对于任何垂直或水平空白区域,[\v\h]均与\p{Space}相同,而不是\s

我现在要更准确地了解字母数字。为简单起见,我将谈谈积极的比赛。反转逻辑以获得负匹配应该很容易。

如果用“字母数字”表示字母或数字,则应该使用恰恰相反的属性。 \pL\p{Letter}的缩写,可能涵盖了这些内容。所有字母都是字母,但字符,\p{Alphabetic}但不是\p{Letter},如罗马数字,带圆圈的字母和各种变音符号。

对于数字,问题是您是否仅包含数字,或者其他数字是否正常。 \pN\p{Number}的缩写,但包含许多非数字。 \d\p{Nd}的缩写,\p{Decimal_Number}的缩写只是\p{Digit}的缩写,尽管\p{POSIX_Digit}也可以。不是数字的数字包括罗马数字,粗俗分数,上标数字和带圆圈的数字。

在Perl 5.11之后的某个时间开始,您可以使用[0-9]之类的属性,只有\p{POSIX_Alpha}\p{POSIX_Alnum}仅用于字母,\p{POSIX_Space}用于两者。还有/(?=\p{ASCII})[\p{Alpha}\p{Digit}]/个版本或更好版本,涵盖9-13个字符加上,完全忽略了后来出现的其他20个空格字符。

在此之前,您仍然可以使用先行断言将匹配限制为ASCII范围,该先行断言仅使用/[\p{Letter}\p{Digit}]/将匹配限制为ASCII,尽管将字符限制为7位非常可追溯到千禧年。 / p>

我可能会让他们使用罗马数字而不是异国情调,所以只使用/[\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会得到字母字符是非数字,(白色)空格字符是非数字,数字字符是非空格,等等。

但仍然没有理由使用{{1}}。

答案 2 :(得分:2)

[^\p{Alnum}\d ] # NOT alnum or space