• ベストアンサー

pref_split 正規表現

$string = 'ああああ\|ああああ|ああああ'; $result = preg_split("/[^\\]\|/",$string); 「\|」はpreg_splitの対象文字列としたくないので、 「"/[^\\]\|/"」としましたが、これだと「あ|」で分割されてしまいます。 いろいろ考えているのですが、答えにたどりつけずにおります。。。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

否定戻り読みですね、こうします。 <?PHP $string = 'ああああ\|ああああ|ああああ'; $pattern="/(?<!\\\\)\|/"; $result = preg_split($pattern,$string); print_r($result); ?> ちょっとわかりにくいですが、|はorですからエスケープして\| \マークはエスケープしてさらにエスケープするので \\\\と4つ重ねます。

YuyaAmano
質問者

お礼

「否定戻り読み、肯定戻り読み、否定先読み、肯定先読み」 このどれも知らない言葉でした。 ありがとうございました。これで前へ進むことができます。 まだ理解できておらず、"/(?<!\\)\|/"←こうしてしまいそうですが、ここからは自分で調べていきたいと思います。 ありがとうございました。

その他の回答 (1)

回答No.2

残念ながら一発で解決するようなかっこいい方法は浮かびませんでした。 泥臭い方法ですが、もとの文字列のややこしい部分を通常は出現しないような文字または文字列で一旦置き換えて後で元に戻すとよいかも。 通常は出現しないような文字または文字列の例を3つ: 1 \t 2 文字コード表の端っこにあるようななんだか変な文字 3 _#_#&@_#9_!8_ あなたが開発するアプリに合わせて出現しないはずの文字または文字列を決めればよいでしょう。 仮にそれがxであるとしたら大まかな流れは次の通り。 (A) 元の文字列 ああああ\|ああああ|ああああ を ああああxああああ|ああああ に一旦変換。 (B) preg_split()を使って | で分割。 (C) 分割後の全ての分割片で x を \| に戻す。

YuyaAmano
質問者

お礼

回答ありがとうございます。 私も同じ事を考えていたのですが、数百万行もある1Gくらいのテキスト処理のためなんとかスマートにやれる方法を探しています。

関連するQ&A