正则表达式中排除换行符的空白字符。

14 浏览
0 Comments

正则表达式中排除换行符的空白字符。

我有时想匹配空白字符但不包括换行符。\n到目前为止,我一直使用[ \\t]。有没有更简洁的方法?

0
0 Comments

正则表达式原因:该正则表达式是为了匹配除了换行符以外的所有空白字符。

解决方法:该正则表达式是在Greg的答案的基础上进行了修改,包括了回车符。作者认为这个正则表达式比没有包含\r的/[^\S\n]/更安全。作者的推理是Windows使用\r\n作为换行符,而Mac OS 9使用\r作为换行符。尽管现在很难找到只有\r而没有\n的情况,但如果确实存在这种情况,它只能表示换行符。因此,既然\r可以表示换行符,我们也应该将其排除在外。

有人对Greg的解决方案进行了评价,称其导致了文本的损坏,但该正则表达式却能正常工作。有时候,仍然有许多程序使用"\r"作为行结束符,有时候我需要一段时间来弄清楚问题就是文件使用了这些字符。或者是它使用了MacRoman字符编码...。

还有人表示最初弄错了这个问题,并在没有给你认可的情况下进行了更改,这就是为什么我在这里给你点赞的原因。

0
0 Comments

问题的原因是Perl的正则表达式中的特殊字符`\h`在某些版本中不被识别。这个字符类代表排除换行符的水平空白字符。解决方法是使用`\s`代替`\h`,因为`\s`是一个通用的空白字符类,可以匹配所有的空白字符,包括水平和垂直的空白字符。

在Perl版本5.10及以后的版本中,支持垂直和水平字符类`\v`和`\h`,以及通用的空白字符类`\s`。其中,水平空白字符类`\h`是最干净的解决方案。它可以匹配ASCII字符集中的制表符和空格,扩展ASCII中的非断行空格,以及Unicode字符集中的一些特殊空格字符。垂直空白字符类`\v`则不太实用,但它可以匹配一些特定的垂直空白字符。

所有的空白字符都是垂直或水平的,没有重叠,但它们不是完全相同的子集,因为`\h`也匹配到了Unicode字符集中的U+00A0 NO-BREAK SPACE,而`\v`也匹配到了U+0085 NEXT LINE,这两个字符都不被`\s`匹配。

解决该问题的另一种方法是使用POSIX字符类`[[:blank:]]`,它可以在大多数语言中工作。然而,`[[:blank:]]`无法匹配NO-BREAK SPACE,因此不是完美的解决方案。

除了Perl的`\h`之外,ICU也支持`\h`,因此这是相当标准的。而POSIX的blank应该在任何支持Unicode正则表达式的引擎中都能匹配到NO-BREAK SPACE。

Perl的`\h`略有非标准之处在于它包含了MONGOLIAN VOWEL SEPARATOR,而Unicode并不认为它是空白字符。因此,Perl的`\h`与POSIX的blank(Perl中的`[[:blank:]]`,Java中的`\p{Blank}`)和Java 8的`\h`有所不同。

关于Unicode认为什么是空白字符(以及什么不是),可以参考维基百科上的表格。

关于哪些正则表达式引擎支持`\h`和POSIX的blank字符类的表格可以在regular-expressions.info/refcharclass.html找到。

解决`\h`不被识别的问题可能是因为使用了不支持该特殊字符的Perl版本。需要查看Perl修复了该问题的版本号。

在Atom编辑器中,`\h+`可以正确匹配空格,但无法用逗号替换。最终可以使用回答中提到的`[^\S\r\n]+`来实现匹配。

在Python中使用`\h`会报错`bad escape \h`。

0
0 Comments

正则表达式中的空白字符是常见的模式匹配需求之一。然而,有时我们需要排除换行符,只匹配其他空白字符。本文将介绍一个在正则表达式中排除换行符的方法,并提供了几种解决方案。

在Perl中,可以使用双重否定(double-negative)的方式来排除换行符。具体的正则表达式模式为

/[^\S\r\n]/

,其中[^\S]表示非非空白字符(即空白字符),\r表示回车符,\n表示换行符。这样的模式可以正确处理Unix(LF)、classic Mac OS(CR)和DOS-ish(CR LF)等不同的换行约定。

为了证明这个方法的可行性,文章中给出了一个Perl脚本的例子。脚本定义了一个正则表达式$ws_not_crlf = qr/[^\S\r\n]/,然后通过遍历不同的字符,判断是否匹配该正则表达式,输出结果。可以看到,空格、制表符和换行符等字符都能成功匹配,而回车符和换行符则不能匹配。

需要注意的是,在Perl v5.18之前,垂直制表符(vertical tab)并未被包含在\s中。然而,在Perl v5.18中已经解决了这个问题,使得[^\S\cK]能够与\s的传统匹配效果相同。

除了上述方法,文章还提到了其他一些解决方案。如果文本使用Unicode编码,可以使用类似于ws_not_nl函数的代码来构建一个模式,该模式能够匹配所有空白字符(除了换行符)。此外,还可以使用POSIX字符类[[:alpha:]]或Unicode属性\p{Letter}来匹配字母字符。

排除换行符的空白字符正则表达式可以通过双重否定的方式实现。这种方法简洁高效,并且能够处理不同的换行约定。对于需要排除换行符的空白字符匹配需求,这是一个可行的解决方案。

0