Не удалось удалить возвраты и / или новые строки из строки в Java - PullRequest
0 голосов
/ 29 марта 2020

Вопрос, который я пытаюсь решить, требует, чтобы я прочитал в текстовом файле и разделил все слова в файле на разные объекты «Token», хранящиеся в ArrayList, без пробелов и переносов. Текущий код:

String[] tokenArray = line.split("\\s+");

удаляет все пробелы из строки, но я не могу удалить новые строки / возвраты.

Я попытался запустить обе эти строки в отдельности перед строкой. Метод split () для удаления новых строк, и они не работают.

line = line.replaceAll("\\r|\\n", "");
line = line.replaceAll("\\R+", "");

Вот весь метод.

public void tokenizeFile(String filePath) throws IOException
{
    String line = "";
    FileReader file = new FileReader(filePath);
    BufferedReader read = new BufferedReader(file);
    tokens.clear();
    keywords = 0;
    while((line = read.readLine()) != null)
    {
        String[] tokenArray = line.split("\\s+");
        for(int i = 0; i < tokenArray.length; i++)
        {
            Token newToken = new Token(tokenArray[i]);
            this.tokens.add(newToken);
            keywords++;
        }
    }
    read.close();
}

примечание: ключевые слова - это совершенно неактуальный private int, который профессор хотел, чтобы его метод увеличивался для каждого объекта, добавляемого в ArrayList

Содержимое ArrayList копируется в массив типа Token obj: Token [] (требование профессора) и затем записывается в вывод. текстовый файл с каждым объектом Token, записанным на новую строку. Вот методы копирования и записи.

public Token[] getTokenizer()
{
    Token[] tokenList = new Token[tokens.size()];
    for(int i = 0; i < tokens.size(); i++)
    {
        tokenList[i] = tokens.get(i);
    }
    return tokenList;
}
public void writeTokens() throws IOException
{
    PrintWriter writer = null;
    try
    {
        Token[] list = getTokenizer();
        writer = new PrintWriter("output.txt");
        for(int i = 0; i < keywords; i++)
        {
            writer.println(list[i]);
        }
        writer.close();
    }
    catch (IOException e)
    {
        System.err.println("Caught IOException: " + e + e.getMessage());
    } finally{
        if (writer != null)
        {
            writer.close();
        }
    }
}

Это содержимое файла, переданного в метод:

The cat in the    hat



one fish two fish    red fish   blue    fish

Это содержимое выходного файла (что writeTokens ( ) пишет):

The
cat
in
the
hat



one
fish
two
fish
red
fish
blue
fish 

Для полного ознакомления:

Token. java

public class Token
{
    private String token;

    public String getValue()
    {
        return token;
    }
    public void setValue(String token)
    {
        this.token = token;
    }
    public Token()
    {

    }
    public Token(String s)
    {
        this.token = s;
    }
    @Override
    public String toString()
    {
        return String.format(token);
    }
}

Tokenizer. java

public class Token
{
    private String token;

    public String getValue()
    {
        return token;
    }
    public void setValue(String token)
    {
        this.token = token;
    }
    public Token()
    {

    }
    public Token(String s)
    {
        this.token = s;
    }
    @Override
    public String toString()
    {
        return String.format(token);
    }
}

Драйвер. java

public class Driver
{
    public static void main(String[] args)
    {
        try
        {
            Tokenizer tokenizer = new Tokenizer();
            tokenizer.tokenizeFile("input.txt");
            tokenizer.writeTokens();
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

РЕДАКТИРОВАТЬ: обновления в ответ на комментарии.

с использованием:

String[] tokenArray = line.split("\\R");

вывод:

The cat in the    hat



one fish two fish    red fish   blue    fish

используя:

String[] tokenArray = line.split("(\\W+)");

выход:

cat
in
the
hat



one
fish
two
fish
red
fish
blue
fish

Моя IDE против кода, и я компилирую с помощью встроенного терминала.

bash-3.2$ javac Driver.java
bash-3.2$ java Driver
bash-3.2$ cat output.txt

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Это проще, чем кажется.

split("\\s+") дает массив для разделения пробелов: пробелы и табуляции. Одна из проблем заключается в том, что строка может начинаться или заканчиваться пробелом, поэтому также дается пустая строка "".

Для новых строк: есть много разделителей строк, \r, r\n, \n, NEL (\u0085). Для этого в регулярном выражении был введен "\\R".

Однако readLine() разумно дает строку без разделителя строк. Так что обо всем позаботится.

0 голосов
/ 29 марта 2020

Попробуйте изменить регулярное выражение

String[] tokens = line.split("(\\W+)");

UPD: Используя jshell, я получил такой вывод:

jshell> String fileContents = new String(Files.readAllBytes(Paths.get("input")));
fileContents ==> "The cat in the      hat\n\none fish two fish    red fish   blue    fish\n"

jshell> fileContents.split("(\\W+)");
$2 ==> String[13] { "The", "cat", "in", "the", "hat", "one", "fish", "two", "fish", "red", "fish", "blue", "fish" }

...