2013-03-05 2 views
1

Я пытался найти способ чтения некоторых данных из файла, ограниченного постоянным разделителем строк.Попытка чтения с сканера с использованием постоянного разделителя строк - java.util.scanner

Разделитель содержит метасимволы, и я пытаюсь разделить ТОЛЬКО там, где оно появляется, поэтому регулярное выражение не подходит.

Может кто-нибудь посоветует мне способ, я знаю, как реализовать свой собственный метод для этого, я спрашиваю, есть ли что-то встроенное в java для этого.

Пример:!

Джон% # @ ~ 23s, 243 лань% # @ ~ 23s, 243% пошли # @ ~ 23s, 243 на рынок, чтобы купить молока!.

приведет ли

Вызов 1: .next() -> John Вызов 2:. .next() -> лань Вызов 3: .next() -> пошел вызов 4: .next() -> на рынок, чтобы купить немного молока.

ответ

1

Разделитель содержит метасимволы, и я пытаюсь разделить ТОЛЬКО там, где оно появляется, поэтому регулярное выражение не подходит.

Вы можете использовать регулярное выражение для разделителя - просто используйте Pattern.quote, чтобы убедиться, что «специальные» символы в регулярных выражениях не мешают.

Это предполагается, что вы все еще хотите использовать Scanner, конечно. Вы можете использовать класс Splitter в пределах Guava

+0

Будет ли использовать pattern.quote только в% # @! ~ 23s, 243, разделенных? или будут разделены другие сортировки одних и тех же персонажей? Вот почему я думал, что регулярное выражение не может быть использовано, потому что я понимаю, что он не проверяет порядок появления символов. –

+0

@JackSmith: Нет, это шаблон - не просто набор символов. Шаблон * может * быть набором символов, но это не вообще. –

+0

Спасибо, сработало. Хотя мне пришлось скрыться от некоторых персонажей. –

0

Хмм, я не уверен, где вы столкнулись с проблемами. Это должно работать:

Код:

String input = "John %#@!~23s,243 doe %#@!~23s,243 went %#@!~23s,243 to market to buy some milk."; 
    Scanner scanner = new Scanner(input).useDelimiter("\\s+" + Pattern.quote("%#@!~23s,243") + "\\s+"); 
    while (scanner.hasNext()) { 
     System.out.println("Token: ." + scanner.next() + "."); 
    } 

Выход:

Token: .John. 
Token: .doe. 
Token: .went. 
Token: .to market to buy some milk.. 

Pattern.quote() не является строго необходимым для этого примера String (не содержит мета-символы), но может быть необходимо в зависимости от фактического ввода.

Смежные вопросы