terça-feira, 10 de novembro de 2015

Non-break space, já ouviu falar ? - Regex em Java

Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar. O que vamos ver hoje aqui é como identificar non-breaking spaces através de uma regex. Se você não sabe o que é uma regex ou, não está familiarizado com elas, recomendo que você dê uma olhada nos posts aqui do blog.

Mas, o que é um non-breaking space ?

Segundo a Wikipedia:

In word processing and digital typesetting, a non-breaking space (" ") (also called no-break space, non-breakable space (NBSP), hard space, or fixed space) is a space character that prevents an automatic line break at its position. In some formats, including HTML, it also prevents consecutive whitespace characters from collapsing into a single space.
In HTML, the common non-breaking space, which is the same width as the ordinary space character, is encoded as   or &#160. In Unicode, it is encoded as U+00A0.
Resumindo: Um non-breaking space é um caractere em branco que evita uma quebra automática de linha em sua posição. Em HTML, o non-breaking space tem a mesma largura que o caractere espaço e codificado como   ou &#160. Em Unicode, é codificado como U+00A0.

OBSERVAÇÃO: Não sei se você notou mas o mnemônico &nbsp tem as mesmas iniciais que non-breaking space. Coincidência ? Acho que não.

Já podemos construir nossa regex em Java ? A resposta é: sim.

 [\\s\\xA0]+  

Vamos entender melhor ?
  • \\s -> Representa um whitespace (caractere em branco).
  • \\xA0 -> Representa o non-breaking space. O \\x é usado para representar um caractere com valor hexadecimal. No nosso caso, o valor é 0xA0.
  • [ ] -> Representam a operação booleana or. No nosso caso queremos identificar ou espaços em branco ou non-breaking spaces.
  • + -> Representa um quantificador. Denota que algo pode se repetir 1 ou infinitas vezes.
Possível pergunta: "Porque na regex você quer capturar também whitespaces ? Não deveriam ser somente os non-breaking spaces?"

A resposta para essa pergunta é bem simples. Eu faço isso para fins de complementação da regex, ou seja, capturando os dois tipos de espaços, eu possuo uma regex mais completa mas, nada me impede que só tenha uma regex que capture espaços em branco ou só non-breaking spaces.

No caso de dúvida sobre os elementos que compõem a nossa regex, você pode dar uma olhada na documentação do Java, clicando aqui ou, dando uma olhada nas referências abaixo.

Diferentemente dos outros posts aqui do blog onde, na maioria das vezes existe um projeto prático, dessa vez eu deixo meu conselho para você, desenvolvedor, que está passando por esse problema. Caso seja importante que seus dados não cheguem sujos na base de dados, realize dois tratamentos. O primeiro é um tratamento via trim(), pode ser feito tanto em Javascript + JQuery ou, como em Java. Não existem preferências.

O segundo tratamento é a substituição dos non-breaking spaces por Strings vazias. Esse, eu recomendo fazer em Java, através do método replaceAll. Este método recebe dois argumentos. O primeiro é uma regex (lá você põe a regex que aprendemos agora) e o segundo é o caractere que será usado para substituição.

Irei deixar nas referências o link para a documentação do método replaceAll.

É isso, terminamos !!!!

Dúvidas !? Sugestões ?! Críticas ou elogios ?!

Deixe aí nos comentários ou na nossa página do facebook.

Facebook: https://www.facebook.com/precisoestudarsempre/

Referências:
Unidentified whitespace character in Java - http://stackoverflow.com/questions/1702601/unidentified-whitespace-character-in-java
Non-breaking space - https://en.wikipedia.org/wiki/Non-breaking_space
Class Pattern - http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
Classe String , método replaceAll - http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replaceAll(java.lang.String,%20java.lang.String)

Um comentário:

Luís Marcelo Bruckner disse...

Fala Maidão,
Parabéns pela postagem.
Excelente como sempre!

Abraço