regex 一般表示式:查找空格(制表符/空格),但不查找换行符

fjaof16o  于 2023-10-22  发布在  其他
关注(0)|答案(6)|浏览(82)

我怎么能有一个正则表达式来测试空格或制表符,而不是换行符?
我试过\s,但我发现它也测试换行符。
我使用C#(.NET)和WPF,但这并不重要。

vql8enpb

vql8enpb1#

使用字符类:[ \t]

mcvgt66p

mcvgt66p2#

试试这个字符集:

[ \t]

这只匹配空格或制表符。

0pizxfdo

0pizxfdo3#

就像Eiríkr Schultlendi指出的那样,公认的解决方案只考虑两个白色空格字符:水平标签(U+0009)和中断空格(U+0020)。它不考虑其他白色空格字符,如非中断空格(这恰好是在我试图处理的文本)。
一个更完整的白色空格字符列表包含在on Wikipedia中,也在linked Perl answer中引用。一个简单的C#解决方案,可以使用字符类减法来构建这些其他字符:

[\s-[\r\n]]

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

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

daupos2t4#

注意:对于那些处理CJK文本(中文,日文和韩文)的人来说,对于我迄今为止尝试过的任何实现(Perl,.NET,PCRE和Python),双字节空间(Unicode \u3000)都包含在\s中。您需要首先规范化字符串(比如用\u0020替换所有的\u3000),或者必须使用一个字符集,该字符集除了要使用的任何其他白色空间(比如[ \t\u3000])之外,还包含此代码点。

如果您使用Perl或PCRE,您可以选择使用\h简写 horizontal whitespace,它似乎包括单字节空格、双字节空格和制表符等。有关详细信息,请参阅 Match whitespace but not newlines (Perl) 问题。
然而,据我所知,这种\h简写还没有在.NET和C#中实现。

eqoofvh9

eqoofvh95#

如果你想替换space,下面的代码在C#中对我有用。

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

对于Tab

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

whhtz7ly6#

你的语法老师可能不是程序员,所以使用双重否定:

[^\S\r\n]

也就是说,not-not-whitespace(大写的S补码)或not-carriage-return或not-newline。用De Morgan’s law分配外部not(* 即 *,字符类中的互补^),这相当于“空格但不回车或换行符”。在模式中包含\r\n可以正确处理所有Unix(LF)、经典Mac OS(CR)和DOS(CR LF)换行符约定。
如果你使用PCRE,other options are available

相关问题