2012-06-23 2 views
1

У меня есть текстовый файл, содержащий некоторые строки, разделенные символом «,». Строки имеют форму: «x: somestring: любая строка». Меня интересует только извлечение значения «somestring». Я мог бы извлечь «SomeString: любая строка», заменив «х:» с «» использованием:Извлечь строки из файла csv в java

Pattern p= Pattern.compile("x:", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(""); 

Но, как я уже говорил, я заинтересован только в «SomeString». Можно ли добавить второй шаблон, чтобы заменить «: any string» на «». Я думал повторить тот же процесс снова, но я хотел спросить о лучшем пути. Есть ли способ улучшить мое регулярное выражение? Обратите внимание, что «somestring» и «any string» не являются фиксированными значениями.

ответ

0

Если у вас есть строка subjectString, которая содержит "x:somestring:any string", то следующая будет извлечь somestring:

Pattern regex = Pattern.compile(
    "(?<=x:) # Assert position right after 'x:'\n" + 
    "[^:]* # Match any number of characters except colons", 
    Pattern.COMMENTS); 
Matcher regexMatcher = regex.matcher(subjectString); 
if (regexMatcher.find()) { 
    ResultString = regexMatcher.group(); 
} 
+0

ваши решения отлично работают. Но это означает, что я должен разбить строки в моем файле, так как это CSV-файл. Затем обрабатывайте каждую разделенную строку, используя ваш код в цикле. Мой файл будет иметь soooooo много строк. любые предложения по обработке моей последовательности строк (string1, string2, string3, ..etc.) сразу без необходимости разбивать каждую строку и обрабатывать их в цикле отдельно? –

+0

Я бы избежал использования регулярных выражений для непосредственного анализа файла CSV. Это обязательно вызовет проблемы (подумайте о встроенных новых строках, цитируемых полях и т. Д.). Лучше использовать библиотеку CSV для обработки самого файла, а затем применить регулярные выражения к полям, которые вы проанализировали. –

1

Используйте раскол:

for (String s : subjectString.split(",")) { 
     s.split(":")[1]; 
    } 
0

Другой, простой способ:

"x:somestring:any string".replaceAll (".*:(.*):.*", "$1") 
+0

Что такое «$ 1»? –

+0

$ 1 - первая группа элементов, захваченных между раундами; здесь объявляется только одна такая группа: Слово между двумя двоеточиями. –