Validar se as aspas estão fechadas corretamente

Boa noite companheiros… preciso de uma ajuda aqui, porque pra variar estou empacado :x

Bom preciso validar se as aspas simples estão todas fechadas corretamente em um String. Até ae tudo bem, o problema surge quando eu tenho caracterer de scape /… Exemplos de validações…

‘anderson => inválido
‘anderson’ => válido
anderson’ => inválido
‘ander’son’’ => válido
‘ander’son’ => inválido

acho que deu para entender… estou empacando quando uma aspa é escapada, pois quando eu faço uma String com esse tipo de conteúdo e vou validar com o seguinte método:

private boolean verifyQuotes(String text) { int check = 0; char[] characters = text.toCharArray(); for (int i = 0, n = characters.length; i < n; i++) { //primeiro verifica se eh uma aspas if (characters[i] == '\'') { //se for aspas verifica se ele nao estah escapando a aspas com uma barra if (characters[i-1] != '\\') { ++check; } else { System.out.println("tem uma barra"); } } } //soh vai ser verdade se tiver um par... return ((check%2) != 0); }

Só que ele simplesmente não vem mais com a barra que foi usada no scape… e agora? alguma dica de como eu faço esse tipo de validação?

Obrigado desde já pela atenção

Não faz dessa forma não, usa Regex, você tem muito mais opções e muito menos código.
Dá uma pesquisada sobre, e se houver alguma dificuldade na montagem da expressão de busca, posta aqui de novo.

Como o colega acima, recomendo a utilização de Regex.

Ficaria mais ou menos assim: ^"[alnum]+"$

Esse site é excelente: http://aurelio.net/er/

Regex no meu caso não sei se daria certo, acho que vcs não compreenderam meu problema:

preciso validar se as aspas estão fechadas, mas não quer dizer que o texto começa com aspas por exemplo:

meu nome é ‘anderson’ => válido
‘anderson’ é meu nome => válido
isso ‘ande’rson’ é meu nome => válido
esse nome, ‘ande’rson’ => inválido

Regex não serveria, na minha opinião, pois ele não consegue contar e sim somente valida a expressão. Este caso é parecido com valdiar se os parenteses estão fechados corretamente, só com a diferença que eles não são escapados… vc valida isso com expressões regulares? não! pois regex não é capaz de contar…

No meu problema, quando eu guardo o conteúdo para ser validado em um String, as barras que foram usadas para o scape simplesmente somem. Não tem uma forma de guardar a String crua, sem que isso ocorra?

alguma outra dica?

Dá pra fazer com Regex sim, mas a expressão ficaria um pouco grande. E pelo jeito você não pesquisou nada, porque se tivesse pesquisado, tinha achado alguma coisa também sobre tokenização.
Tokenizando, usando o método Splt() do String ou a Classe Scanner, você conse ter o numero de aspas em uma expressão.

[quote=Jaba]Dá pra fazer com Regex sim, mas a expressão ficaria um pouco grande. E pelo jeito você não pesquisou nada, porque se tivesse pesquisado, tinha achado alguma coisa também sobre tokenização.
Tokenizando, usando o método Splt() do String ou a Classe Scanner, você conse ter o numero de aspas em uma expressão.[/quote]

Jaba, eu pesquisei sim, sou muito fã de expressões regulares e tenho bastante referencia, não diga algo que vc não saiba. No meu caso saber o número de aspas em uma expressao não resolve… olha:

String teste = “‘ander’son’”;

o teste, vai vir para mim desse jeito => ‘ander’son’… note que se eu tivesse gravado as aspas sem o scape, estaria errado, mas com o scape a string tah vindo sem a barra, se eu for contar o número de aspas não vai funcionar nunca. Percebeu?
eu só não consigo mesmo ver uma solução utilizando expressões regulares, pois se tivesse visto uma prévia solução já a teria adotado e não teria reportado o erro! Caso vc tenha conhecimento de que realmente funcionaria com ER, oka… por favor poste o código (isso não é provocação, apenas curiosidade para ganho de conhecimento).
Obrigado pela atenção

Claro que dá pra fazer tokenização, e eu não estou falando do que eu não sei. Porque, poxa, se voce tem mesmo bastante referência, porque reinventar a roda com esse método que você postou?

Esse negócio do Slash(barra) não dá pra evitar, você vai ter que dar o replace para duas barras, porque a JVM reconhece \qualquercoisa como sinal de escape.

[quote=Jaba]Claro que dá pra fazer tokenização, e eu não estou falando do que eu não sei. Porque, poxa, se voce tem mesmo bastante referência, porque reinventar a roda com esse método que você postou?

Esse negócio do Slash(barra) não dá pra evitar, você vai ter que dar o replace para duas barras, porque a JVM reconhece \qualquercoisa como sinal de escape.[/quote]

oka, ficaria como então?

Seu presente de Natal atrasado, veja se é isso que você quer, se deu certo e dá um Feedback aí.

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Aspas{

    public static void main (String args[]){

        ArrayList<String> palavras = new ArrayList();
        palavras.add("'anderson");
        palavras.add("'anderson'");
        palavras.add("anderson'");
        palavras.add("'ander\\'son\\''");
        palavras.add("'ander'son'");

        for(String s : palavras){
            System.out.println("A Expressao " + s + " é Valida? " + validaExpressao(s,"'"));
        }
        
    }

    public static boolean validaExpressao(String texto, String caracterBusca){

        int quantidadeAspasExpressao = 0;
        
        Pattern p = Pattern.compile(caracterBusca);
        Matcher m = p.matcher(texto);
        
        while(m.find()) {
            m.start();
            quantidadeAspasExpressao = quantidadeAspasExpressao + 1;
        }

        //Verifica se é Par
        return (quantidadeAspasExpressao % 2 == 0);

    }

}