コンマで分割する必要がある文字列を解析するには、正規表現が必要です...分割として使用されるコンマは、引用符で囲まれていないコンマにのみ一致します...
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 エスケープ): "(,)(?=(?:[^\"]|\"[^\"] \") $)"