A API Java para expressões regulares indica que \s
corresponderão aos espaços em branco. Portanto, a regex \\s\\s
deve corresponder a dois espaços.
Pattern whitespace = Pattern.compile("\\s\\s");
matcher = whitespace.matcher(modLine);
while (matcher.find()) matcher.replaceAll(" ");
O objetivo disso é substituir todas as instâncias de dois espaços em branco consecutivos por um único espaço. No entanto, isso não funciona realmente.
Estou tendo um grave mal-entendido sobre regexes ou o termo "espaço em branco"?
"abc \xA0 def \x85 xyz"
para ver o que quero dizer: existem apenas três campos ali.Respostas:
Sim, você precisa pegar o resultado de
matcher.replaceAll()
:fonte
Você não pode usar
\s
em Java para corresponder ao espaço em branco em seu próprio conjunto de caracteres nativos, porque o Java não oferece suporte à propriedade de espaço em branco Unicode - embora isso seja estritamente necessário para atender ao RL1.2 do UTS # 18! O que ele tem não está em conformidade com os padrões, infelizmente.O Unicode define 26 pontos de código como
\p{White_Space}
: 20 deles são vários tipos de\pZ
GeneralCategory = Separator e os 6 restantes são\p{Cc}
GeneralCategory = Control .O espaço em branco é uma propriedade bastante estável, e esses mesmos existem praticamente desde sempre. Mesmo assim, o Java não tem nenhuma propriedade que esteja em conformidade com o padrão Unicode para eles, então você deve usar um código como este:
Agora você pode usar
whitespace_charclass + "+"
como padrão em seureplaceAll
.Desculpe por tudo isso. As regexes do Java simplesmente não funcionam muito bem em seu próprio conjunto de caracteres nativos e , portanto, você realmente precisa passar por obstáculos exóticos para fazê-los funcionar.
E se você acha que o espaço em branco é ruim, você deve ver o que você precisa fazer para conseguir
\w
e\b
finalmente se comportar corretamente!Sim, é possível e sim, é uma bagunça entorpecente. Isso é ser caridoso, até. A maneira mais fácil de obter uma biblioteca regex em conformidade com os padrões para Java é transferir JNI para as coisas do ICU. Isso é o que o Google faz para o Android, porque OraSun's não está à altura.
Se você não quiser fazer isso, mas ainda quiser ficar com o Java, eu tenho uma biblioteca de reescrita de regex de front-end que escrevi que "corrige" os padrões do Java, pelo menos para que estejam em conformidade com os requisitos de RL1.2a em UTS # 18, Expressões regulares Unicode .
fonte
Para Java (não php, não javascript, nenhum outro):
fonte
quando enviei uma pergunta a um fórum Regexbuddy (aplicativo de desenvolvedor regex), obtive uma resposta mais exata à minha pergunta sobre Java:
"Autor da mensagem: Jan Goyvaerts
Em Java, as abreviações \ s, \ d e \ w incluem apenas caracteres ASCII. ... Este não é um bug em Java, mas simplesmente uma das muitas coisas que você precisa estar ciente ao trabalhar com expressões regulares. Para combinar todos os espaços em branco Unicode, bem como quebras de linha, você pode usar [\ s \ p {Z}] em Java. RegexBuddy ainda não oferece suporte a propriedades específicas de Java, como \ p {javaSpaceChar} (que corresponde exatamente aos mesmos caracteres que [\ s \ p {Z}]).
... \ s \ s corresponderá a dois espaços, se a entrada for apenas ASCII. O verdadeiro problema é com o código do OP, como é apontado pela resposta aceita nessa questão. ”
fonte
[\s\p{z}]
omite o caractere Unicode "próxima linha" U + 0085. Use[\s\u0085\p{Z}]
.Parece funcionar para mim:
irá imprimir:
Acho que você pretendia fazer isso em vez de seu código:
fonte
Para sua finalidade, você pode usar este snnippet:
Isso normalizará o espaçamento para simples e removerá os espaços em branco iniciais e finais também.
fonte
fonte
Java evoluiu desde que esse problema foi levantado pela primeira vez. Você pode combinar todos os tipos de caracteres de espaço Unicode usando o
\p{Zs}
grupo.Portanto, se você quiser substituir um ou mais espaços exóticos por um espaço simples, poderá fazer o seguinte:
Também vale a pena conhecer, se você usou a
trim()
função string você deve dar uma olhada no (relativamente novo)strip()
,stripLeading()
estripTrailing()
funções em cordas. O pode ajudá-lo a eliminar todos os tipos de caracteres de espaço em branco. Para obter mais informações sobre qual espaço está incluído, consulte aCharacter.isWhitespace()
função Java .fonte
O uso de espaços em branco em ER é uma dor, mas acredito que funcionam. O problema do OP também pode ser resolvido usando StringTokenizer ou o método split (). No entanto, para usar RE (descomente println () para ver como o matcher está quebrando a String), aqui está um código de amostra:
Ele produz o seguinte (compilar com javac e executar no prompt de comando):
% java Two21WS inicial: "ab cdef gh ij kl" Two21WS: "ab cdef gh ij kl"
fonte
replaceAll()
?