Заменить \ и заменить новую строку в java

Я пишу код для обнаружения плохих ключевых слов в файле. Вот шаги, которым я следую:

  1. Токенизация с помощью StreamTokenizer
  2. Используйте сопоставление шаблонов, чтобы найти совпадения

    while(streamTokenizer.nextToken() != StreamTokenizer.TT_EOF){
                if(streamTokenizer.ttype == StreamTokenizer.TT_WORD) {
                    String token = streamTokenizer.sval.trim().replaceAll("\\\\n", "")
                    final Matcher matcher = badKeywordPattern.matcher(token)
                    if(matcher.find()) { // bad tokens found
                         return true;
                    }
                }
    }
    

String token = streamTokenizer.sval.trim().replaceAll("\\\\n", "") выполняется для сопоставления токена, охватывающего несколько строк, с \. Пример:

bad\ token

Однако замена не работает. Какие-либо предложения? Есть другие способы сделать это?


person bindhukc    schedule 24.04.2017    source источник
comment
пробовали это String token = streamTokenizer.sval.trim().replaceAll("\\"+"\n", "")   -  person Kh.Taheri    schedule 25.04.2017
comment
Это не сработает. Вы не получите весь многострочный жетон одним куском. Вы должны цинкатенировать.   -  person user207421    schedule 25.04.2017


Ответы (3)


Предполагая, что вы хотите удалить все \, помещенные в конец строки, вместе с разделителем строк, вы можете использовать replaceAll("\\\\\\R","").

  • Чтобы представить \ в регулярном выражении (это то, что использует replaceAll), нам нужно экранировать его с помощью другого \, что оставляет нас с \\. Но поскольку \ также является особенным в строковых литералах, нам нужно снова экранировать каждый из них с помощью другой обратной косой черты, которая оставляет нам "\\\\"

  • Начиная с Java 8, мы можем использовать \R (который должен быть записан как "\\R", поскольку \ требует экранирования) для представления разделителей строк, таких как \r \n или \r\n пара.

person Pshemo    schedule 24.04.2017

Если я правильно понимаю, вы не хотите использовать регулярное выражение (что и делает String.replaceAll), просто выполните замену буквальной строки с помощью _ 2_ и используйте на одну обратную косую черту меньше:

String token = streamTokenizer.sval.trim().replace("\\\n", "")
person Boann    schedule 25.04.2017

На основе ответа @Pshemo, который показывает, как \ & \n представлены в регулярном выражении, и, как уже упоминалось, здесь. Сделать это можно так:

String[] tkns = streamTokenizer.sval.trim().split("\\\\\\R"); // yourString = "bad\\\ntaken"
StringBuffer token= new StringBuffer();
for (String tkn : tkns)
{
    token.append(tkn);
    //System.out.println(tkn);
}
//final Matcher matcher = badKeywordPattern.matcher(token)
person Kh.Taheri    schedule 25.04.2017