3

文字列をコンマとスペースで分割する正規表現を試しました。式は、1 つだけを除くすべてのケースに一致します。私が試したコードは次のとおりです。

        List<string> strNewSplit = new List<string>();
        Regex csvSplit = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled);
        foreach (Match match in csvSplit.Matches(input))
        {
            strNewSplit.Add(match.Value.TrimStart(','));
        }
        return strNewSplit;

CASE1: "MYSQL,ORACLE","C#,ASP.NET"

期待される出力:

「MySQL、オラクル」

「C#、ASP.NET」

結果:合格

ケース 2: "MYSQL、ORACLE"、"C#、ASP.NET"

期待される出力:

「MySQL、オラクル」

「C#、ASP.NET」

実際のアウトプット:

「MySQL、オラクル」

"C#

ASP.NET」

結果: 失敗。

2 つの DoubleQuotes の間のコンマの後にスペースを入れると、適切な出力が得られませんでした。何か不足していますか?より良い解決策を提供してください。

4

1 に答える 1

1

私は通常、解析する入力のEBNFを書き留めます。

あなたの場合、私は言うでしょう:

List = ListItem {Space *、Space * ListItem} *;

ListItem ="""識別子"""; //識別子はすべてです"

スペース=[\t] +;

つまり、Listは、ゼロまたは複数(*)のListItemが後に続くListItemで構成され、スペースはコンマとスペースで区切られます。

それは私を次のように導きます(あなたはListItemsを検索しています):

static void Main(string[] args)
{
    matchRegex("\"MYSQL,ORACLE\",\"C#,ASP.NET\"").ForEach(Console.WriteLine);
    matchRegex("\"MYSQL,ORACLE\", \"C#,ASP.NET\"").ForEach(Console.WriteLine);
}
static List<string> matchRegex(string input)
{
    List<string> strNewSplit = new List<string>();
    Regex csvSplit = new Regex(
        "(\"(?:[^\"]*)\")"
        , RegexOptions.Compiled);
    foreach (Match match in csvSplit.Matches(input))
    {
       strNewSplit.Add(match.Value.TrimStart(','))
    }
    return strNewSplit;
}

これはあなたが望むものを返します。私があなたを正しく理解したことを願っています。

于 2012-05-17T06:20:37.230 に答える