Использование пробелов в Java Regex - PullRequest
2 голосов
/ 10 декабря 2011

У меня большие трудности с пробелами в Java при использовании регулярных выражений.Назначение состоит в том, чтобы разбить входную строку, разделенную запятыми, например,

J,Project report,"F, G, I",1

на отдельные строки, содержащие:
J
Отчет по проекту
F, G, I
1
если это имеет смысл.Я использую сканер, чтобы разделить строку.Я использую регулярное выражение (и код).

while (t.hasNext("([a-zA-Z0-9]| )*(\".+\")*,?")) { 
    System.out.println("t.next is : " + t.next());

... где t - сканер входной строки, как описано выше.Но это, кажется, никогда не прибегает к истине, поскольку ничего не напечатано.Самое близкое, что я могу получить к работе, это просто использовать ". *" В качестве моего регулярного выражения, но это будет разделять пробелами, и мне нужно разделять только запятыми, а НЕ в кавычках.Кто-нибудь может помочь?Спасибо.

Ответы [ 4 ]

1 голос
/ 10 декабря 2011

CSV-файлы более сложны, чем кажутся на первый взгляд. Например, в немецких странах разделителем файлов обычно является ";" характер ..... Хотя я понимаю, что ваша задача была использовать регулярные выражения, не тратьте свое время на решение этой проблемы по-настоящему.

Мой инструмент выбора opencsv . Вот отличный сценарий (я оставляю вас, чтобы преобразовать его в Java), который анализирует вашу строку:

import au.com.bytecode.opencsv.CSVParser

@Grapes([
    @Grab(group='net.sf.opencsv', module='opencsv', version='2.3')
])

CSVParser csv = new CSVParser()
String[] result = csv.parseLine('J,Project report,"F, G, I",1')

assert result[0] == "J"
assert result[1] == "Project report"
assert result[2] == "F, G, I"
assert result[3] == "1"

Объект CSVReader предоставляет способы перебора содержимого файла:

new File("data.csv").withReader { reader ->
    CSVReader csv = new CSVReader(reader);

    csv.readAll().each {
        println it[0]
        println it[1]
        println it[2]
        println it[3]
    }
}
1 голос
/ 10 декабря 2011

Попробуйте это:

(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)")

Ссылка: Java: разбиение строки через запятую, но игнорирование запятых в кавычках

Кроме того, http://regexpal.com/ - действительно полезный и полезный инструмент для проверки регулярных выражений:)

1 голос
/ 10 декабря 2011

Я согласен с предположением, что надежная библиотека CSV третьего партнера - это путь. Однако вот как вы можете использовать Scanner.

Scanner t = new Scanner(new File("test.csv"));
t.useDelimiter(',(?=([^\"]*\"[^\"]*\")*[^\"]*$)');
while( t.hasNext() ) {
    System.out.println(t.next());
}

Я использовал регулярное выражение из ответа @Hristo.

1 голос
/ 10 декабря 2011

Это МОЖЕТ быть сделано с регулярным выражением, но регулярное выражение, возможно, не лучший инструмент для работы.Выражение, которое вы получите в итоге, будет трудно читать / поддерживать, и оно не обязательно будет более эффективным.

Не вдаваясь в подробности, поскольку это ваша домашняя работа, а не моя, я подумаю об этом по-другому:

Вам нужен сканер с отслеживанием состояния.У вас есть два состояния: «Я в кавычках» и «Я не».Сканируйте строковый символ за символом, и каждый символ заставит вас либо накапливать будущий результат, либо выдавать результат, либо изменять состояния.

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

a,"b\"c",d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...