改行に一致-\ nまたは\ r \ n?


159

この回答を書いいる間、s-flag(dotall-ドットは改行に一致します)を使用する代わりに、改行のみに一致する必要がありました。

正規表現のテストに通常使用されるサイトは、\nまたはに一致させようとすると、動作が異なり\r\nます。

私は気づきました

  • Regex101は改行のみに一致します\n
    -削除\rして一致)

  • RegExrはオン とオンのどちら\n でも改行に一致\r\n
    せず、m-flagと\s
    )を除いて、改行に一致するものを見つけることができません

  • Debuggexの動作はさらに異なります
    この例では\r\n、にのみ一致しますが、
    ここ\nは、同じフラグとエンジンが指定されているにのみ一致します

私はm-flag(複数行-行^の先頭と$末尾を一致させる)を完全に認識していますが、これがオプションにならない場合があります。\sタブやスペースにも一致するため、と同じです。

Unicodeの改行文字(\u0085)を使用するという私の考えはうまくいかなかったので、

  1. 改行の一致を(できれば使用言語に関係なく)正規表現に統合するフェイルセーフな方法はありますか?
  2. 上記のサイトの動作が異なるのはなぜですか(特にDebuggex、1回だけ\nと1 回だけ一致\r\n)。

15
あなたは試すことができます[\r\n]+-または、このような何か
イリヤBursov

3
私は使用します:とライン終端シーケンスの\r?\n両方を一致させるため。古いMac構文では機能しませんが、最近では珍しい構文です。\r\n\n\r
ridgerunner 2013年

6
こんにちは、私はdebuggexの創設者です。これはバグのようです(debuggexの場合、他の人のために話すことはできません)。この質問に関連する高優先度の問題を追加しました。できるだけ早く対応いたします。現在、(非常に限られた)リソースのすべてを別の製品の発売に注力しています。
Sergiu Toarca 2013年

2
@ridgerunnerを使用してMacの構文を追加すると、(\ r?\ n | \ r)を実行できます。これは、以下のPeter van der Walの回答に似ていますが、よりコンパクトです(10文字vs 12文字)。
Doktor J

回答:


220

反対方向に答えます。

2)についての完全な説明については\r\n:私はここに掲載する予定よりもはるかに完了し、この質問を参照する必要があるとの違いを、\ n、および\ rは?

一言で言えば、Linuxは\n改行、Windows \r\nおよび古いMacを使用してい\rます。したがって、改行を書く方法は複数あります。2番目のツール(RegExr)は、たとえば、シングルで一致し\rます。

1)[\r\n]+イリヤが提案したように機能しますが、複数の連続する改行にも一致します。(\r\n|\r|\n)より正しいです。


したがって、\r/ \nはオペレーティングシステムに依存しています-それは知っているかもしれません(;))-しかし、なぜ2つのdebuggex-examplesが\ r \ nと\ nで一度一致するのですか?少なくとも、(例では)目に見える違いはありません。
KeyNone 2013年

ほとんどの場合、Windowsのテキストエディタから1つをコピーし、もう1つはdebuggex textareaに直接書き込んだためです。それぞれが異なる改行を使用しました。
OGHaza 2013年

1
確かに、3番目の例(シニアメンズ...)には\r\nテキスト内にがあるため(右クリックしてソースを表示すると、{{Infobox XC Championships\r\n|Name =どこかで見つかります)。2番目のツールはFlashで記述されており、概要ページを読むと、改行文字を含む少しバグがあります。
Peter van der Wal

1
(\r\n|\r|\n)より簡単に次のように書くことができます\r\n?
Asad Saeeduddin

2
@AsadSaeeduddinいいえ、できません。Unixの行末とは一致しません\n
Peter van der Wal

12

Debuggexのサンプルテキストの行末が異なります。特に興味深いのは、Debuggexが最初に使用した行末のスタイルを識別しているようで、入力されたすべての追加の行末をそのスタイルに変換することです。

Notepad ++を使用して、UnixおよびWindows形式のサンプルテキストをDebuggexに貼り付けました。最初に貼り付けたものが、そのDebuggexのセッションに残っていたものです。

したがって、Debuggexに貼り付ける前に、テキストエディタでテキストを洗う必要があります。希望するスタイルを貼り付けていることを確認してください。DebuggexのデフォルトはUnixスタイル(\ n)です。

また、NEL(\ u0085)はまったく異なるものです:https : //en.wikipedia.org/wiki/Newline#Unicode

(\r?\n)UnixとWindowsをカバーします。(\r\n|\r|\n)古いMacにもマッチさせるには、など、もっと複雑なものが必要になります。


debuggexについて非常に興味深い点!また、\ u0085を指摘してくれてありがとう、誤解を招きました。
KeyNone 2013年

3

PCREで\R一致した\n\r\r\n


質問はありません
サンドウェル2018

1
@サンドウェル:申し訳ありません、私はあなたに連絡しません、これは質問ではありません、それはより単純な答えです(\r\n|\r|\n)
トト

2

これは質問1にのみ適用されます。

Windowsで実行され、複数行のMFCエディターボックスを使用するアプリがあります。
エディターボックスはCRLF改行を想定しています
が、本当に大きくて厄介な正規表現で入力されたテキストを解析する必要があります。

正規表現の作成中にこのことを強調したくなかったので
、パーサーとエディターの間で相互に正規化して
、正規表現がそのまま使用できるようにしました\n。また、貼り付け操作をトラップして、ボックス用に変換します。

これにはそれほど時間はかかりません。
これは私が使用するものです。

 boost::regex  CRLFCRtoLF (
     " \\r\\n | \\r(?!\\n) "
     , MODx);

 boost::regex  CRLFCRtoCRLF (
     " \\r\\n?+ | \\n "
     , MODx);


 // Convert (All style) linebreaks to linefeeds 
 // ---------------------------------------
 void ReplaceCRLFCRtoLF( string& strSrc, string& strDest )
 {
    strDest  = boost::regex_replace ( strSrc, CRLFCRtoLF, "\\n" );
 }

 // Convert linefeeds to linebreaks (Windows) 
 // ---------------------------------------
 void ReplaceCRLFCRtoCRLF( string& strSrc, string& strDest )
 {
    strDest  = boost::regex_replace ( strSrc, CRLFCRtoCRLF, "\\r\\n" );
 }

2

Pythonの場合:

# as Peter van der Wal's answer
re.split(r'\r\n|\r|\n', text, flags=re.M) 

またはより厳密:

# https://docs.python.org/3/library/stdtypes.html#str.splitlines
str.splitlines()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.