正则表达式:查找空格(制表符/空格),但不包括换行符。

138

如何编写一个正则表达式来检测空格或制表符,但不匹配换行符?

我尝试了 \s,但发现它也会匹配换行符。

我使用的是C# (.NET) 和 WPF,但这并不重要。


这可能很重要。.NET正则表达式函数具有多行选项。没有一个答案涉及到它(即使默认值可能足够)。 - Peter Mortensen
6个回答

257

使用字符类:[ \t]

(注:该句为原文,无需翻译)

1
非常适合我的问题。另请参见https://dev59.com/OHA75IYBdhLWcg3wGlIa#25956935,其中包含仅限于Perl的`\h`字符类,但它确实显示了许多其他空格字符,以防您需要在此处添加它们到列表中。 - goodeye
4
为什么在\t前面要留一个空格? - Ooker
4
为了捕捉一个字面上的空间,需要使用特定的工具或技术来记录和重现它所占据的位置和维度。 - codemonkee
1
这不会匹配其他类型的空格,正如其他答案所提到的那样。 - Gus
2
为什么在 \t 前面要加一个空格? - Chau Pham

53
尝试使用这组字符集:
[ \t]

这只匹配空格或制表符。


21

正如Eiríkr Útlendi所指出的,该解决方案仅考虑两个空格字符:水平制表符(U+0009)和断开空格(U+0020)。它不考虑其他空格字符,例如不间断空格(恰好在我试图处理的文本中)。

更完整的空格字符列表包括于维基百科并且也在链接的Perl答案中提到。可以使用字符类减法构建一个简单的C#解决方案以考虑这些其他字符:

[\s-[\r\n]]

或者,包括 Eiríkr Útlendi 的解决方案,你得到

[\s\u3000-[\r\n]]

7
注意:对于处理CJK文本(中文,日文和韩文)的人来说,双字节空格(Unicode \u3000)在我尝试过的任何实现(Perl,.NET,PCRE和Python)中不包括\s中。您需要首先规范化字符串(例如通过将所有\u3000替换为\u0020),或者您将不得不使用一个包括此代码点以及其他任何您正在针对的空白的字符集,例如[ \t\u3000]
如果您正在使用Perl或PCRE,则可以选择使用\h简写表示水平空格,它似乎包括单字节空格,双字节空格和制表符等内容。有关详细信息,请参见匹配空格但不匹配换行符(Perl)问题。
然而,据我所知,对于.NET和C#,这个\ h简写还没有被实现。

1
好的观点。Java的\h(在Java 8中引入)确实包括\u3000,但是\s不包括,除非您设置UNICODE_CHARACTER_CLASS模式(在Java 7中引入)。 - Alan Moore

0

如果你想要替换空格,下面的C#代码对我起作用了。

Regex.Replace(Line, "\\\s", "");

对于选项卡

Regex.Replace(Line, "\\\s\\\s", "");

0
你的语法老师可能不是程序员,所以使用双重否定:
[^\S\r\n]

那就是,非非空格(大写的S补集)或非回车或非换行符。将外部的非(即字符类中的补集^)与德摩根定律一起分配,这等效于“空格但不包括回车或换行符”。在模式中包括\r和\n可以正确处理Unix(LF)、经典Mac OS(CR)和DOS风格(CR LF)的换行约定。
如果您使用PCRE,还有其他选项可供选择。

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