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.
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.
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
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.
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#
\h
classe de caractere somente perl , mas mostra que existem muitos outros caracteres de espaço em branco, caso você precise adicioná-los à lista aqui.\t
?Experimente este conjunto de caracteres:
Isso corresponde apenas a um espaço ou tabulador.
fonte
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
ou, incluindo a solução de Eiríkr Útlendi, você obtém
fonte
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\s
nenhuma implementação que tentei até agora (Perl, .NET, PCRE, Python). Você precisará normalizar suas strings primeiro (por exemplo, substituindo todos\u3000
por\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
\h
abreviaçã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
\h
atalho não foi implementado para .NET e C #, pelo que pude ver.fonte
\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).Se você deseja substituir o espaço abaixo do código funcionou para mim em
C#
Regex.Replace(Line,"\\\s","");
Para guia
Regex.Replace(Line,"\\\s\\\s","");
fonte