uso da função delimitador a partir do scanner para “abc-def”
-
09-09-2019 - |
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;)
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 / p>
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 ??strong>
o próximo método (String) afirma que você obtenha apenas palavras desde o useDelimiter original () falha método "|"
Nota ??strong>
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+|$)