3

このpreg_splitコードを同等のJavaに「変換」する必要があります。私は成功せずにいくつかのことを試みました。これが私が翻訳しようとしているPHPコードです:

$str="1 [3 4 5] 6 7 [8 9] 4";
$chars = preg_split("^\[(.*?)\]||/ /^", $str, -1, PREG_SPLIT_DELIM_CAPTURE);

foreach ($chars as $key => $value) {
    if(ord($value)!=0 && $value!=" "){
        $res[]=$value;
    }
}
print_r($res);

ご覧のとおり、私の文字列入力は、任意の数文字のシーケンスで構成でき、そのうちのいくつかは[]角かっこで囲まれています。

1 [3 4 5] 6 7 [8 9] 4

角かっこは文字列の最初または最後のどちらでもかまいません。制限はありません。

上記の例に従うと、結果は次のようになります。

[0] = "1"
[1] => "3 4 5"
[2] => "6"
[3] => "7"
[4] => "8 9"
[5] => "4"

正規表現を変換しようとすると、いくつかの問題が見つかりました( "\"は無効なエスケープシーケンスとして失敗するように見えます)。

4

1 に答える 1

3

問題を「分割」と考えるのではなく、探しているフォームの任意の1つの部分文字列に一致する正規表現を考え出し、その式のすべての一致を収集します。次に例を示します。

Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|\\d+");
Matcher m = p.matcher(inputStr);
List<String> matches = new ArrayList<String>();
while(m.find()) matches.add(m.group());

左側のビット|は角括弧の間のすべてに一致し、右側のビットは他の数字のシーケンスに一致します。

Java文字列リテラルで正規表現を記述したい場合は、バックスラッシュを2倍にする必要があることに注意してください。このリテラル"\\"は、1つのバックスラッシュを含む1文字の文字列を表します。

于 2012-11-13T23:52:29.767 に答える