4

分割するか、文字列内の何かを検索するには Java RegEx が必要ですが、二重引用符で囲まれたものは除外します。私が今していることはこれです:

String withoutQuotes = str.replaceAll("\\\".*?\\\"", "placeholder");
withoutQuotes = withoutQuotes.replaceAll(" ","");

しかし、これは indexOf ではうまく機能しません。たとえば、次のように分割できるようにする必要もあります。

String str = "hello;world;how;\"are;you?\""
String[] strArray = str.split(/*some regex*/);
// strArray now contains: ["hello", "world", "how", "\"are you?\"]
  • 引用符は常にバランスが取れています
  • 引用符は次のようにエスケープできます\"

どんな助けでも大歓迎です

4

2 に答える 2

5

ここにあなたのために働くコードがあります:

String str = "a \"hello world;\";b \"hi there!\"";
String[] arr = str.split(";(?=(([^\"]*\"){2})*[^\"]*$)");
System.out.println(Arrays.toString(arr));

;この正規表現は、セミコロンの後に偶数個の二重引用符が続く場合 (つまり、引用符の外にあることを意味します)、セミコロンを検出します。

出力:

[a "hello world;", b "hi there!"]

PS: 次のようなエスケープされた引用符は処理しません。\"

于 2013-11-04T16:52:12.747 に答える
0

言及されていない単純な正規表現ソリューションがあったため、この質問を復活させます。(正規表現バウンティクエストの調査中にあなたの質問を見つけました。)

\"[^\"]*\"|(;)

代替の左側は、引用符で囲まれた完全な文字列に一致します。これらの一致は無視されます。右側はセミコロンをグループ 1 に一致させてキャプチャします。左側の式では一致しなかったため、それらが右側のセミコロンであることがわかります。

ここに作業コードがあります(オンラインデモを参照):

import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;

class Program {
public static void main (String[] args) throws java.lang.Exception  {

String subject = "hello;world;how;\"are;you?\"";
Pattern regex = Pattern.compile("\"[^\"]*\"|(;)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
    if(m.group(1) != null) m.appendReplacement(b, "SplitHere");
    else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
String[] splits = replaced.split("SplitHere");
for (String split : splits) System.out.println(split);
} // end main
} // end Program

参照

  1. 状況 s1、s2、s3 以外でパターンを一致させる方法
  2. パターンを一致させる方法...
于 2014-05-19T23:15:38.400 に答える