powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
8 сообщений из 8, страница 1 из 1
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
    #38397112
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hi

Необходимо прочесть входной файл и вытряхнуть из него только слова, отослав в игнор все переводы строки и знаки препинания.
В следующем коде проблема в row.split(ptn): для строки, содержащей только разделитель из шаблона, возвращается массимв длины 1, а не 0.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
import java.util.*;
import java.io.*;
import java.util.regex.*;

class WordsOnly2 {
  public static void main(String[] args) {
    new WordsOnly2().go();
  }
  void go() {
    BufferedReader br;
    List<String> a = new LinkedList<String>();

    String row, ptn;
    // ptn="[\\p{Punct}*\\s]+";
    //ptn="\\s+";
    ptn="\\W+";

    String src="C:\\gutenberg.txt";
    String tgt="C:\\gutenberg.tmp";
    try {
      br = new BufferedReader(new FileReader(src));
      while ( (row=br.readLine()) != null ) {
        System.out.println("row=>"+row+"< length="+row.split(ptn).length+", size="+Arrays.asList(row.split(ptn)).size() );
        a.addAll( Arrays.asList(row.split(ptn)) );
      }
      br.close();
    } catch(Exception x) { x.printStackTrace(); }
  }
}


Входной файл:
Код: plaintext
1.
2.
3.
4.
5.
6.
The Project Gutenberg EBook of The King James Bible





This eBook is for the use of anyone
(NB: между первой и второй строками - несколько подряд переводов).

Output:
Код: plaintext
1.
2.
3.
4.
5.
6.
row=>The Project Gutenberg EBook of The King James Bible< length=9, size=9
row=>< length=1, size=1
row=>< length=1, size=1
row=>< length=1, size=1
row=>< length=1, size=1
row=>< length=1, size=1
row=>This eBook is for the use of anyone< length=8, size=8

Надо что-то подсунуть в шаблон ptn, чтобы для row=>< (а на самом деле это перевод строки) row.split(ptn).length был = 0.
Понятно, что можно предварительно проверять строку "на непусто", но хотелось бы обойтись без лишних операторов.

Подскажите, плз, можно ли это сделать.
...
Рейтинг: 0 / 0
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
    #38397190
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
... вроде бы не получится :( http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split(java.lang.String, int) If the expression does not match any part of the input then the resulting array has just one element, namely this string .
...
Рейтинг: 0 / 0
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
    #38397244
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis
Код: java
1.
ptn="\\W+";

С этим паттерном все работает
...
Рейтинг: 0 / 0
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
    #38397651
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanС этим паттерном все работаетНет. Множественные переводы строк не схлопываются в одинарный:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
import java.util.*;
import java.io.*;
import java.util.regex.*;

class WordsOnly2 {
  public static void main(String[] args) {
    new WordsOnly2().go();
  }
  void go() {
    BufferedReader br;
    BufferedWriter bw;
    List<String> a = new LinkedList<String>();

    String row, ptn;
    // ptn="[\\p{Punct}*\\s]+";
    //ptn="\\s+";
    ptn="\\W+";

    String src="C:\\gutenberg.txt";
    String tgt="C:\\gutenberg.tmp";
    try {
      br = new BufferedReader(new FileReader(src));
      while ( (row=br.readLine()) != null ) {
        System.out.println("row=>"+row+"< length="+row.split(ptn).length+", size="+Arrays.asList(row.split(ptn)).size() );
        a.addAll( Arrays.asList(row.split(ptn)) );
      }
      br.close();

      bw = new BufferedWriter(new FileWriter(tgt));
      for(String r : a) { 
        //bw.write(r+"\n"); // var-1
        bw.write(r); bw.newLine(); //  var-2
      }
      bw.close();

    } catch(Exception x) { x.printStackTrace(); }
  }
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
C:\>type gutenberg.tmp
The
Project
Gutenberg
EBook
of
The
King
James
Bible





This
eBook
is
for
the
use
of
anyone
...
Рейтинг: 0 / 0
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
    #38398025
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisМножественные переводы строк не схлопываются в одинарныйВсмысле, подряд идущих? Если так, то все схлопывается за раз:
Код: java
1.
2.
System.out.println(Arrays.toString("Hello, \r\nWorld\r\n\r\n\r\n234\r \r \r \r\n \n\n\n !!!".split("\\W+")));
// [Hello, World, 234]
...
Рейтинг: 0 / 0
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
    #38398046
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

ну так почему тогда при чтении файла не схлопываются ? (при таком же паттерне, "\\W+").
Файлик - в аттаче.
...
Рейтинг: 0 / 0
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
    #38398076
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis,

Вы неправильно схлопывали. Нужно было так: ;)
Код: java
1.
2.
3.
4.
5.
6.
7.
BufferedReader br = new BufferedReader(...);
StringBuilder text = new StringBuilder();
while (br.ready()) {
	text.append(br.readLine());
}
br.close();
System.out.println(Arrays.toString(text.toString().split("\\W+")));

Или - для построчного считывания из файла:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
BufferedReader br = new BufferedReader(...);
while (br.ready()) {
	String line = br.readLine().trim();
	if (!line.isEmpty()) {
		for (String word: line.split("\\W+")) {
			System.out.println(word);
		}
	}
}
br.close();
...
Рейтинг: 0 / 0
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
    #38398081
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

спасибо, буду пробовать.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]