如何在Perl中测试一个字符串是否只包含空格

13

如何使用正则表达式测试一个字符串是否只包含空格字符?


参见:https://dev59.com/UkvSa4cB1Zd3GeqPbAUL - Alex
3个回答

16
if($string=~/^\s*$/){
    #is 100% whitespace (remember 100% of the empty string is also whitespace)
    #use /^\s+$/ if you want to exclude the empty string
}

请注意,Perl 对匹配运算符有默认标志,因此可能在作用域的其他地方设置了 /m 选项。这意味着 ^$ 匹配行的开头或结尾,从而允许锚点之前和之后的文本。为避免这种情况,请使用字符串的开头和结尾锚点:/\A\s*\z/ - brian d foy

9

我决定编辑我的帖子,包括以下与tobyodavies的对话中的概念。

在大多数情况下,您想确定某个东西是否为空格,因为空格相对不重要,您想跳过仅由空格组成的字符串。因此,我认为您想确定的是是否存在重要字符。

所以我倾向于使用反向测试:$str =~ /\S/。确定谓词“字符串包含一个Significant字符”。

然而,为了应用您的特定问题,可以通过测试来确定否定:$str !~ /\S/


3
完全取决于你是否希望 "" 匹配或不匹配。 - ysth
1
不喜欢双重否定——不包含非空格字符...对此有些疑虑,但绝对是解决问题的有趣方式! - tobyodavies
2
@tobyodavies,这取决于你过滤仅空格字符串的原因。根据我的经验,大多数情况下你想要排除或忽略它们。所以,这实际上是一个<em>积极</em>的测试。另外,我认为\S不是负面的,而是一个补集 - Axeman
@Axeman 如果你把它读作补集的一部分,这是否意味着你对这个正则表达式的英文阅读是“包含至少一个非空格字符集合的补集成员”?我不确定这样读是否更好... 此外,如果您想忽略空格字符串,则操作符将不同-if($str=~/\S/){ ... },因此_此答案_是一个双重否定。 - tobyodavies
@Axeman,正是如此,你证明了我的观点-在你的示例中使用了=〜而不是!〜作为运算符。那是第二个否定,而不是空格与打印字符相反(我对此提出异议-空格与字符是足够独立的概念,因为你可以在任何东西上留白...并且从词源上看,“whitespace”没有否定意义)。 - tobyodavies
显示剩余2条评论

1

你的正则表达式语句应该寻找^\s+$。它需要至少一个空格。

如果你想知道,"white space"被定义为[\t\n\f\r\p{Z}]。请参见http://userguide.icu-project.org/strings/regexp

\t  Match a HORIZONTAL TABULATION, \u0009.
\n  Match a LINE FEED, \u000A.
\f  Match a FORM FEED, \u000C.
\r  Match a CARRIAGE RETURN, \u000D.
\p{UNICODE PROPERTY NAME}   Match any character with the specified Unicode Property.

请注意,Perl的匹配运算符有默认标志,因此可能已经在作用域的其他地方设置了/m选项。这意味着^$匹配行的开头或结尾,从而允许锚点之前和之后的文本。为了避免这种情况,请使用字符串的开头和结尾锚点:/\A\s*\z/ - brian d foy
此外,有关空白字符的定义,请参阅 perlrecharclass - brian d foy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接