簡體   English   中英

使用Java解析包含轉義字符的字符串

[英]Parsing a string containing escaped characters using Java


我想知道是否有人可以幫我弄清楚如何解析具有以下格式的字符串:

;field1-field2-fieldN;field1-field2-fieldN;

每條記錄都以';'分隔 並且記錄中的每個字段由“ - ”分隔。 復雜的是,各個字段可能包含轉義的分隔符字符,如“\\;” 要么 ”-”。 這導致我下面的簡單解析代碼失敗。 所以我想要做的是提出與分隔符匹配但與轉義分隔符不匹配的正則表達式。 我的正則表達式知識並不是那么好,但我希望必須有一種方法可以將“([^ \\;])”和“([;])”結合起來得到我需要的東西。

public static List<ParsedRecord> parse(String data) {
    List<ParsedRecord> parsedRecords = new List<ParsedRecord>();
    String[] records = data.split(";");
    for (String record : records) {
        String[] fields = data.split("-");
        parsedRecords.add(new parsedRecord(fields));
    }
    return parsedRecords;
}

首先十分感謝。

你很可能最好不要在同一個傳球中進行失誤和分裂。 我知道在分離兩個獨立的功能部分方面感覺不對,但它避免了一些尷尬的角落情況(例如,想象“foo \\; bar”,其中;遵循反斜杠但仍然是分隔符)。

這里有一些非常簡單的代碼來進行解析 - 它假設任何反斜杠基本上都意味着“將下一個字符視為普通輸入”,但這就是全部。

import java.util.*;

public class Test
{
    public static void main(String[] args)
    {
        List<String> parsed = parse(args[0]);
        for (String x : parsed)
        {
            System.out.println(x);
        }
    }

    public static List<String> parse(String text)
    {
        List<String> ret = new ArrayList<String>();
        StringBuilder current = new StringBuilder();
        boolean escaping = false;

        for (int i=0; i < text.length(); i++)
        {
            char c = text.charAt(i);
            if (escaping)
            {
                current.append(c);
                escaping = false;
            }
            else
            {
                if (c == '\\')
                {
                    escaping = true;
                }
                else if (c == ';')
                {
                    ret.add(current.toString());
                    current = new StringBuilder();
                }
                else
                {
                    current.append(c);
                }
            }
        }
        if (escaping)
        {
            throw new IllegalArgumentException("Ended in escape sequence");
        }
        ret.add(current.toString());
        return ret;
    }
}

(請注意,這並不是將每個記錄分成多個字段的業務,但是您只需要更改使用';'進行的操作,並對' - '做出反應 - 原理是相同的。)

您可以使用這樣的方式優化與split一起使用的正則表達式:

split("[^\\];")

拆分任何“;” 但如果之前有一個“\\”,則不會。 破折號也是如此:

split("[^\\]-")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM