Expressão regular: encontre espaços (tabulações / espaço), mas não novas linhas


96

Como posso ter uma expressão regular que testa espaços ou tabulações, mas não novas linhas. Eu tentei, \smas descobri que ele testa para novas linhas também.

Eu uso C # / WPF, mas isso não importa.

Respostas:


189

Use classes de personagens: [ \t]


1
Veja o meu problema. Veja também stackoverflow.com/a/25956935/292060 para uma \hclasse de caractere somente perl , mas mostra que existem muitos outros caracteres de espaço em branco, caso você precise adicioná-los à lista aqui.
goodeye

3
por que deveria haver um espaço antes \t?
Ooker

4
@Ooker Para capturar um espaço literal
codemonkee

Isso não corresponde a outros tipos de espaços, como outras respostas mencionaram.
Gus

1
Por que um espaço antes de \ t?
Catbuilts de

35

Experimente este conjunto de caracteres:

[ \t]

Isso corresponde apenas a um espaço ou tabulador.


14

Como @ Eiríkr Útlendi observou, a solução aceita considera apenas dois caracteres de espaço em branco: a tabulação horizontal (U + 0009) e um espaço de quebra (U + 0020). Ele não considera outros caracteres de espaço em branco, como espaços sem quebra (que por acaso estão no texto com o qual estou tentando lidar). Uma lista de caracteres de espaço em branco mais completa está incluída na Wikipedia e também referenciada na resposta Perl vinculada . Uma solução C # simples que leva em conta esses outros caracteres pode ser construída usando a subtração de classe de caractere

[\s-[\r\n]]

ou, incluindo a solução de Eiríkr Útlendi, você obtém

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

3

Observação: para aqueles que lidam com texto CJK (chinês, japonês e coreano), o espaço de byte duplo (Unicode \u3000) não está incluído em \snenhuma implementação que tentei até agora (Perl, .NET, PCRE, Python). Você precisará normalizar suas strings primeiro (por exemplo, substituindo todos \u3000por \u0020) ou terá que usar um conjunto de caracteres que inclua este ponto de código além de qualquer outro espaço em branco que você esteja almejando, como [ \t\u3000].

Se estiver usando Perl ou PCRE, você tem a opção de usar a \habreviação para espaços em branco horizontais , que parecem incluir o espaço de byte único, espaço de byte duplo e tabulação, entre outros. Veja o tópico Match whitespace but not newlines (Perl) para mais detalhes.

No entanto, esse \hatalho não foi implementado para .NET e C #, pelo que pude ver.


1
Bom ponto. Java \h(introduzido no Java 8) inclui \u3000, mas não inclui \s, a menos que você defina o modo UNICODE_CHARACTER_CLASS (introduzido no Java 7).
Alan Moore,

0

Se você deseja substituir o espaço abaixo do código funcionou para mim emC#

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

Para guia

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.