1

目標は、バックスラッシュが前に付いている場合を除いて、文字列を行に分割することです。視覚化しましょう。このような文字列:

Hello\
 world!
Bye, world.

分割する必要があります:

[0] Hello world!
[1] Bye, world!

私はこの正規表現を思いついた(PHPの場合preg_split):

/(?<!\\\\)\n/

分割し、分割時にバックスラッシュを考慮に入れますが、次のようになります。

  • バックスラッシュと改行文字は存続します。
  • UNIXライクな改行(\n)でのみ機能します。

したがって、実際には次のように出力されます。

[0] Hello\\x10 world!
[1] Bye, world!

私の正規表現はどのように見えるべきですか?

これまでのところ、問題を解決するために、私は試しました:

/(?<!\\\\)(?:\r\n|\n|\r)/
/(?:(?<!\\\\)\n)/

しかし、それらのどれも機能しませんでした。

4

2 に答える 2

3

あなたは2つのステップでそれをする必要があります:

  1. 行に参加する
  2. 次に分割
$text = preg_replace('/(?<!\\\\)((?:\\\\\\\\)*)\\\\((?:\n|\r)+)/', "$1", $text);
$result = preg_split('/(\r|\n)+/', $text);

最初の正規表現では、改行の前に奇数のスラッシュがある場合にのみ分割されるため、「エスケープされたスラッシュ」が保持されます。

このため、最後にエスケープされた円記号を実際の円記号に置き換えることを検討してください。

$text = preg_replace('/(?<!\\\\)((?:\\\\\\\\)*)\\\\((?:\n|\r)+)/', "$1", $text);
$text = preg_replace('/\\\\\\\\(?=(\\\\\\\\)*$)/m', '\\', $text);
$result = preg_split('/\r\n?|\n/', $text);
于 2012-11-25T10:31:07.373 に答える
2

問題を解決するための最初の試みは、すでにかなりうまくいっています。ただし、分割を行うのと同じ正規表現では、改行を取り除くことはできません。これを最初に入力で使用できますpreg_replace(エスケープされた改行を削除するため)。

$str = preg_replace('/\\\\(?:\r\n?|\n)/', '', $str);

次に、次のように簡単に実行preg_splitします。

$result = preg_split('/\r\n?|\n/', $str);

注:行末の末尾の空白が無視されるように、円記号の位置をもう少し許容したい場合があります。これにより、最初の置換は次のようになります。

$str = preg_replace('/\\\\[ \t]*(?:\r\n?|\n)/', '', $str);

これで、行の終わり(バックスラッシュの後)にある偶発的なタブまたはスペースがエスケープを壊すことはありません。

于 2012-11-25T10:30:06.873 に答える