Pergunta

Atualmente estou tentando filtrar um arquivo de texto que contém palavras que são separadas com um "-". Quero contar as palavras.

scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+"));

O problema que ocorre simplesmente é: palavras que contêm um "-" vai ficar separados e contados por ser duas palavras. Então, só escapando com \ -. Não é a solução de escolha

Como posso alterar o delimitador-expressão, de modo que palavras como "foo-bar" vai ficar, mas o "-" só serão filtradas e ignorado

Graças;)

Foi útil?

Solução

OK, eu estou supondo que a sua pergunta aqui: você quer dizer que você tem um arquivo de texto com alguma prosa "real", ou seja, frases que realmente fazem sentido, são separados por pontuação e similares, etc., certo

Exemplo:

Esta situação é amenizada - tanto quanto nós podemos dizer - pelo fato de que os nossos aliados mais confiáveis, os Vorgons, continuar a manter os seus concursos de poesia Slam; o inimigo tem pouco incentivo para interferir com que, mesmo com seus dispositivos Mute-O-Matic.

Então, o que você precisa como delimitador é algo que é ou qualquer quantidade de espaços em branco e / ou pontuação (que você já tenha coberto com a regex você mostrou), ou um hífen que está cercada por pelo menos um espaço em cada lado . O personagem regex para "ou" é "|". Existe um atalho para a classe de caracteres em branco (espaços, tabulações e novas linhas) em muitas implementações regex: "\ s"

"[.,:;()?!\"\s]+|\s+-\s+"

Outras dicas

Se possível, tente usar as classes pré-definidas ... faz com que a regex muito mais fácil de ler. Veja java.util.regex.Pattern para opções.

Talvez isso é o que você está procurando:

string.split("\\s+(\\W*\\s)?"

Lê:. Jogo 1 ou mais espaços em branco caracteres opcionalmente seguido de zero ou mais não-palavra personagens e um espaço em branco

Isto não é muito simples. Uma coisa para tentar seria {current-delimitador-chars} {zero-ou-mais-hífens} {de zero-ou-mais-atual-delimitador-chars-ou-hífen}.

Pode ser mais fácil simplesmente ignorar as palavras retornados pelo scanner de que consistem inteiramente de hífens

Scanner scanner = new Scanner("one   two2  -   (three) four-five - ,....|");
scanner.useDelimiter("(\\B+-\\B+|[.,:;()?!\" \t|])+");

while (scanner.hasNext()) {
    System.out.println(scanner.next("\\w+(-\\w+)*"));
}

Nota

o próximo método (String) afirma que você obtenha apenas palavras desde o useDelimiter original () falha método "|"

Nota

você usou a expressão regular "\ r \ n | \ n" como de terminador de linha. Os JavaDocs para shows java.util.regex.Pattern outros terminadores de linha possíveis, então uma verificação mais completa usaria a expressão "\ r \ n | [\ r \ n \ u2028 \ u2029 \ u0085]"

Esta deve ser uma bastante simples: [^\\w-]\\W*|-\\W+

  • Mas é claro que se ele de prosa, e que deseja excluir sublinhados :
    [^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
  • ou se você não espera numerics:
    [^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+

EDIT: Estas são as formas mais fáceis. Tenha em mente a solução completa, que iria lidar com traços no início e no final das linhas que seguem este padrão. (?:^|[^\\w-])\\W*|-(?:\\W+|$)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top