Регулярное выражение, заменить все запятые между двойными кавычками - PullRequest
1 голос
/ 02 ноября 2009

У меня есть эта строка:

1001,"Fitzsimmons, Des Marteau, Beale and Nunn",109,"George","COD","Standard",,109,8/14/1998 8:50:02

Какое регулярное выражение я бы использовал для замены запятых в "Fitzsimmons, Des Marteau, Beale and Nunn" с трубкой | так оно и есть:

"Fitzsimmons| Des Marteau| Beale and Nunn"

Должен был пояснить, что я делю эту строку, используя запятые, поэтому я хочу, чтобы "Fitzsimmons, Des Marteau, Beale and Nunn" была строкой. Я планирую заменить | запятой после того, как разделю его.

Ответы [ 6 ]

4 голосов
/ 02 ноября 2009

Я пытался использовать StringTokenizer , но это не сработало, поэтому вот код, который, кажется, делает то, что вы хотите:

import java.util.*;

public class JTest
{
    public static void main(String[] args)
    {
    String str = "1001,\"Fitzsimmons, Des Marteau, Beale and Nunn\",109,\"George\",\"COD\",\"Standard\",,109,8/14/1998 8:50:02";
    String copy = new String();

    boolean inQuotes = false;

    for(int i=0; i<str.length(); ++i)
        {
        if (str.charAt(i)=='"')
            inQuotes = !inQuotes;
        if (str.charAt(i)==',' && inQuotes)
            copy += '|';
        else
            copy += str.charAt(i);
        }

    System.out.println(str);
    System.out.println(copy);
    }
}
4 голосов
/ 02 ноября 2009

Хотя было бы возможно сделать с регулярными выражениями, было бы намного яснее сначала разбить строку на поля, а затем выполнить замену. Существует хорошая (бесплатная) библиотека Java для анализа файлов CSV, которая называется opencsv .

3 голосов
/ 02 ноября 2009

Привет, Брэндон, ты можешь легко сделать это с RE, используя взгляд назад и взгляд в будущее. см. код ниже

String cvsString = "1001,\"Fitzsimmons, Des Marteau, Beale and Nunn\",109,\"George\",\"COD\",\"Standard\",,109,8/14/1998 8:50:02";  
String rePattern = "(?<=\")([^\"]+?),([^\"]+?)(?=\")";  
// first replace  
String oldString = cvsString;  
String resultString = cvsString.replaceAll(rePattern, "$1|$2");  
// additional repalces until until no more changes  
while (!resultString.equalsIgnoreCase(oldString)){  
    oldString = resultString;  
    resultString = resultString.replaceAll(rePattern, "$1|$2");  
}  

Строка результата будет 1001,"Fitzsimmons| Des Marteau| Beale and Nunn",109,"George","COD","Standard",,109,8/14/1998 8:50:02

NingZhang.info

2 голосов
/ 02 ноября 2009

Вот немного Python, который, кажется, делает свое дело:

>>> import re
>>> p = re.compile('["][^"]*["]|[^,]*')
>>> x = """1001,"Fitzsimmons, Des Marteau, Beale and Nunn",109,"George","COD","Standard",,109,8/14/1998 8:50:02"""
>>> y = p.findall(x)
>>> ','.join(z.replace(',','|') for z in y if z)
'1001,"Fitzsimmons| Des Marteau| Beale and Nunn",109,"George","COD","Standard",109,8/14/1998 8:50:02'

Похоже, этот код превращается в код вопроса о гольфе: -)

Упс ... пропустил тег Java.

1 голос
/ 02 ноября 2009

Ну, это CSV-файл, поэтому я бы использовал встроенную в Ruby библиотеку CSV. Тогда вам не нужно разбираться, например, в том, что делать с экранированными кавычками.

require 'csv'
string =<<CSV
1001,"Fitzsimmons, Des Marteau, Beale and Nunn",109,"George","COD","Standard",,109,8/14/1998 8:50:02
CSV
csv=CSV.parse string
csv.each{|row| row.each {|cell| cell.gsub!(",","|") if cell.is_a?(String)}}
outstring = ""
CSV::Writer.generate(outstring){|out| csv.each {|row| out<<row}}
1 голос
/ 02 ноября 2009

Я полагаю, что это будет очень трудно сделать с регулярным выражением.Проблема в том, что регулярное выражение должно было бы подсчитывать кавычки, чтобы определить, находится ли оно в двух кавычках или нет.

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

Возможно, вам придется написать некоторый процедурный код, чтобы выполнить это.

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