EOFに一致する正規表現


90

このようなデータがあります

john, dave, chris
rick, sam, bob
joe, milt, paul

名前を一致させるためにこの正規表現を使用しています

/(\w.+?)(\r\n|\n|,)/

これは最後の値がで終わっていないという意味最後の単語の後に突然の大部分は動作しますが、ファイルの終了\r\n\nまたは,それがEOFで終わります。正規表現でEOFを一致させる方法はありますか?そのため、2番目のグループに正しく配置できますか?


1つのグループのすべての名前をキャプチャしようとしていますか、それとも名前ごとに1つのキャプチャグループをキャプチャしようとしていますか?
Andrew Hare、

正規表現で問題が発生したときに行うことの1つは、パターンの要素を分離して試すことです。最後のトークンが気になる場合は、トークンなしで式をテストしてください。
akf 2009

素晴らしい正規表現テストサイトを追加したいだけです:regexplanet.com/simple
northpole 2009


@シナン-同意します。統合
マークグラベル

回答:


159

この質問への答えは\Z、それを理解するのにしばらくかかりましたが、現在は機能しています。逆に、音符\A(とは対照的に、全体の文字列の先頭一致する^$1つのラインの先頭に一致します)。


5
in file searchとは対照的に、プロジェクトファイルの検索でnetbeansのような機能を使用している場合、次の動作は異なります... ...そして、さらに掘り下げると、プロジェクトフォルダで何が機能するかがわかります: 参考までに:これは、すべての終了phpタグをファイルの終わりにある改行で置き換えることです。(\s*)\?>(\s*)\Z(\s*)\?>(\s*)(\n*)(\W)\Z
MediaVince 2014

1
結局のところ\Aまた、検索と置換のVisual Studioで動作します。いつものようにそのようなことを慎重に使用してください、しかしそれが私が実際に正しいことをしたと思って満足したら、私に手間をかける多くの手間を省きました。
スティーブペティファー

私はJavaのScannerクラスを使用してファイル全体を一度に読み取りますが、\Z区切り文字として使用すると、末尾の改行文字が削除されます。区切り文字をに変更すると\z、末尾の改行文字が保持されました。と思われるマーティンDoreyの答えはまた、Javaに適用されます。
mmdemirbas 2018年

24

EOFは実際には文字ではありません。複数行の文字列がある場合、 '$'は文字列の終わりだけでなく行の終わりにも一致します。

Perlとその兄弟で、\Aかつ\Z完全に改行を無視して、文字列の先頭と末尾に一致します。

POSIX正規表現の使用にGNUの拡張\`\'同じもののために。


17

Visual Studioでは、次のようにEOFを見つけることができます$(?![\r\n])。これは、行末がCR、CRLF、またはLFのいずれであっても機能します。

おまけとして、すべてのコードファイルに次のような最終改行マーカーを含めることができます。

               Find What: (?<![\r\n])$(?![\r\n])
            Replace With: \r\n
 Use Regular Expressions: checked
Look at these file types: *.cs, *.cshtml, *.js

仕組み:

CRまたはLFで始まらず、CRまたはLFも後に続かない行端(ゼロ幅一致)を見つけます。これがなぜ機能するのか、いくつかの考えがあなたに示されます!

CR、LF、またはCRLFであっても、目的の行終了文字に置き換える必要があることに注意してください。


Visual Studio 2019にはバグがあり、これをすべて置換すると、ファイルの最後に2つの改行が追加される可能性があります。保存オプションでの自動改行の自動挿入と関係があると思います。
Stevoisiak

9

ライアンが提案した\ Zの動作を\ zと比較してください。

$ perl -we 'my $ corpus = "hello \ n"; $ corpus =〜s / \ Z / world / g; print( ":$ corpus:\ n") '
:こんにちは世界
世界:
$ perl -we 'my $ corpus = "hello \ n"; $ corpus =〜s / \ z / world / g; print( ":$ corpus:\ n") '
:こんにちは
世界:
ドル 

perlre sez:

\ Z文字列の最後、または末尾の改行の前でのみ一致
\ z文字列の最後でのみ一致

テストケースのRuby(1.8.7、1.9.2)への変換は同じように動作します。


2

行セパレーターを本当にキャプチャする必要がありますか?そうでない場合は、この正規表現で十分です。

/\w+/

これは、例のように、照合するすべての部分文字列が完全に単語文字で構成されていることを前提としています。



2

最近、私はこのようなものを探していましたが、JavaScriptを探していました。

これをここに置くと、同じ問題を持つ誰もが利益を得ることができます

var matchEndOfInput = /$(?![\r\n])/gm;

基本的に、これは行末と一致し、その後に改行文字や改行文字は続きません。本質的にこれは\ZJavaScript と同じです。


1

文字列を全体として扱うために適切な修飾子強制を使用していると想定し(行ごとではなく、\ n機能する場合はそれを使用しています)、別の代替方法を追加します-文字列の終わり:(\ r \ n | \ n |、| $)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.