Объясните работающее выражение Regex - PullRequest
0 голосов
/ 22 декабря 2011

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

Если кто-то может дать мне пошаговое объяснение того, как это выражение оценивает шаблон, оно будет оценено

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

Спасибо

==== Старая запись

Это хорошо работает для меня - либо соответствует "двум кавычкам и тому, что между ними", либо "что-то между началом строки или запятой и концом строки или запятой". Перебор совпадений возвращает мне все поля, даже если они пусты. Например,

быстрый, "коричневый, лиса прыгает", над ",", "ленивая собака" разбивается на

быстрый "коричневый, лис перепрыгивает" через "" ленивую собаку "

import java.util.ArrayList; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class CSVParser { 

    /* 
     * This Pattern will match on either quoted text or text between commas, including 
     * whitespace, and accounting for beginning and end of line. 
     */ 
    private final Pattern csvPattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?:,|$)");   
    private ArrayList<String> allMatches = null;         
    private Matcher matcher = null; 
    private String match = null; 
    private int size; 

    public CSVParser() {                 
        allMatches = new ArrayList<String>(); 
        matcher = null; 
        match = null; 
    } 

    public String[] parse(String csvLine) { 
        matcher = csvPattern.matcher(csvLine); 
        allMatches.clear(); 
        String match; 
        while (matcher.find()) { 
                match = matcher.group(1); 
                if (match!=null) { 
                        allMatches.add(match); 
                } 
                else { 
                        allMatches.add(matcher.group(2)); 
                } 
        } 

        size = allMatches.size();                
        if (size > 0) { 
                return allMatches.toArray(new String[size]); 
        } 
        else { 
                return new String[0]; 
        }                        
    }    

    public static void main(String[] args) {             
        String lineinput = "the quick,\"brown, fox jumps\",over,\"the\",,\"lazy dog\""; 

        CSVParser myCSV = new CSVParser(); 
        System.out.println("Testing CSVParser with: \n " + lineinput); 
        for (String s : myCSV.parse(lineinput)) { 
                System.out.println(s); 
        } 
    } 

} 

Ответы [ 2 ]

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

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

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

() это группа

* является квантификатором

Если сразу после открывающей скобки есть ?, то это особая группа, здесь (?<=,|^) - это утверждение за кадром.

В квадратных скобках указывается класс символов, например [^\"]. Это особенный, из-за ^ в начале. Это отрицательный класс символов.

| обозначает чередование, то есть оператор ИЛИ.

(?:,|$) - группа без захвата

$ - это специальный символ в регулярном выражении, это якорь (соответствующий концу строки)

0 голосов
/ 22 декабря 2011
"([^\"]*)"|(?<=,|^)([^,]*)(?:,|$)
() capture group
(?:) non-capture group
[] any character within the bracket matches
\ escape character used to match operators aka "
(?<=) positive lookbehind (looks to see if the contained matches before the marker)
| either or operator (matches either side of the pipe)
^ beginning of line operator
* zero or more of the preceding character
$ or \z end of line operator 

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

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