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.

Jiew Meng
fonte

Respostas:

189

Use classes de personagens: [ \t]

Lekensteyn
fonte
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.

quiabo
fonte
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]]
Erdomke
fonte
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.

Eiríkr Útlendi
fonte
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","");

Sameer Bahad
fonte