-4

コンマで分割する必要がある文字列を解析するには、正規表現が必要です...分割として使用されるコンマは、引用符で囲まれていないコンマにのみ一致します...

should be 3: 3 (is right)
should be 3: 14 (is wrong, counted commas inside quotes)
should be 24: 12 (is wrong)
should be 24: 24. (is right)

次の結果のテスト ケースの場合:

String line ="com.day.image;uses:=\"javax.imageio.stream,javax.imageio.spi,javax.imageio.plugins.jpeg,org.slf4j,javax.imageio.metadata,javax.imageio,com.day.imageio.plugins,com.day.image.font\",com.day.imageio.plugins;uses:=\"javax.imageio,javax.imageio.metadata,javax.imageio.stream,javax.imageio.spi,org.w3c.dom\",com.day.image.font;uses:=\"com.day.image\"";

        String[] results1 = line.split("\",");
        String[] results2 = line.split(",");

        System.out.println("should be 3: "+ results1.length);
        System.out.println("should be 3: "+ results2.length);

        line = "com.day.cq.commons,com.day.cq.commons.inherit,com.day.cq.wcm.api,com.day.cq.wcm.api.components,com.day.cq.wcm.api.designer,com.day.cq.wcm.commons,com.day.cq.wcm.tags,com.day.cq.widget,javax.servlet,javax.servlet.http,javax.servlet.jsp;version=\"2.1\",javax.servlet.jsp.el;version=\"2.1\",javax.servlet.jsp.jstl.core,javax.servlet.jsp.jstl.fmt,javax.servlet.jsp.tagext;version=\"2.1\",org.apache.commons.lang;version=\"2.4\",org.apache.sling.api;version=\"2.1\",org.apache.sling.api.request;version=\"2.1\",org.apache.sling.api.resource;version=\"2.1\",org.apache.sling.api.scripting;version=\"2.1\",org.apache.sling.api.servlets;version=\"2.1\",org.apache.sling.scripting.jsp.taglib;version=\"2.0\",org.apache.sling.scripting.jsp.util;version=\"2.0\",org.slf4j;version=\"1.5\"";

        results1 = line.split("\",");
        results2 = line.split(",");

        System.out.println("should be 24: "+ results1.length);
        System.out.println("should be 24: "+ results2.length);

出力は、

should be 3: 3
should be 3: 14
should be 24: 12
should be 24: 24

更新しました

私は自分が何を必要としているのかをよく理解していますが、それを行う方法がわかりませんでした..私が達成しようとしていたことの説明は最善ではありませんでした. 不適切な定義の問題は、ほとんど解決につながりません。私の能力の 1 つは、複雑なシナリオを単純化することです。明らかに、今夜は私には向いていませんでした。

検索後、Google の検索用語である「引用符以外の文字に一致させるにはどうすればよいですか?」という質問をもう一度絞り込みます。

正しい質問を Google にも尋ねると、Google の最初の結果が最も可能性が高いことはよく知られています ;)。

最初の結果、引用符の外側のコンマを選択する正規表現

正規表現は次のようになります: (,)(?=(?:[^"']|["|'][^"'] ") $)。

テストして動作しました..

最後に、プログラミングスキルと理解スキルには違いがあると思いますが、間違いなく、多くのプログラマーがそれらを一緒に行っているわけではありません..私はいくつかの場所で尋ねましたが、ほとんどの人はそれは不可能だと言っています...明らかにそうです。

お時間をいただきありがとうございます。急いで助けを求めて申し訳ありません。

このサイトは素晴らしいです!:)

更新2

この正規表現 (,)(?=(?:[^"']|["|'][^"'] ") $)。StackOverFlowの問題を私に与えています..!!

at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)

明らかに、一部の入力では正常に機能しますが、他の入力では機能しません! または、Java 正規表現エンジンにバグがありますか?

更新3

この正規表現はオーバーフローせず、機能します (Java エスケープ): "(,)(?=(?:[^\"]|\"[^\"] \") $)"

4

1 に答える 1

2

正規表現は、何かが引用符、括弧、括弧などの「内側」か「外側」かを追跡するのには適していません。したがって、これを行う最善の方法は、現在の文字が引用符のセット内にあるかどうかを追跡するフラグを使用して、文字列を 1 文字ずつ調べることです (このフラグは false で始まり、オンとオフに切り替わります)。引用符が出現するため)。

ただし、これを正規表現で行う場合は、最初に文字列を引用符 ( intermediate = line.split("\"");) で分割し、中間リストの各要素をコンマで分割してから、結果を連結することをお勧めします。各配列の最後の要素を次の最初の要素と結合し、それらを引用符で区切る必要があるため、連結の手順は少し複雑です。

別の可能性: 最初に文字列を引用符で分割し、次に奇数番号のセグメントに出現するコンマを文字列のどこにも現れない文字シーケンス ( など$split$) に置き換えますが、偶数番号のセグメントは残します (つまり、 、引用されたセクションを表すもの)のみ。セグメントを 1 つの文字列に再結合し (もちろん、セグメントの各ペアの間に引用符を再挿入します)、その文字列を のインスタンスで分割します$split$

于 2012-12-07T03:52:15.027 に答える