正規表現の最後の発生?


121

私は
必要な最後のバックスラッシュの後の最後の部分をキャッチしようとしています\Web_ERP_Assistant(と\

私の考えは:

C:\Projects\Ensure_Solution\Assistance\App_WebReferences\Web_ERP_WebService\Web_ERP_Assistant


\\.+?(?!\\)      //  I know there is something with negative look -ahead `(?!\\)`

しかし、私はそれを見つけることができません。

[Regexer Demo]


2
あなたの質問が正規表現に関連していたことを感謝しますが、これがここで使用するのに最適なツールですか?ほとんどの標準ライブラリには、指定されたディレクトリの最後のパス名を取得するメソッドがあります。これは、指定されたOSでのディレクトリセパレーターも考慮に入れます。
Steve Rukuts、2011

@Raskolnikov正規表現でそれが必要です。Pth.getFileNameWithoutExtensionを知っています。QUestionは正規表現としてタグ付けされています
Royi Namir

2
わかりました。十分確認してください。そのときは、正規表現に詳しい人に任せます。
Steve Rukuts、2011

回答:


95

あなたの否定的な先読みの解決策は例えばこれです:

\\(?:.(?!\\))+$

それを参照してくださいRegexrにここに


2
(?:非キャプチャグループの始まりです。.任意の文字で、このチェックそれは``が続いていない場合は任意の文字。
stea

Multi行は、必要なRegexrテスト専用です。の意味が変わります$。標準は文字列の終わりで、Multilineは行の終わりです。Regexrのテストテキストには複数の行があるため、このオプションが必要です。
stea

元の質問と同じ要求をしたいが、最初に\がない場合はどうなりますか?
Royi Namir

2
(?:[^\\/](?!(\\|/)))+$先頭のスラッシュを削除し、スラッシュとバックスラッシュの両方に対応します。また、スラッシュのないパスの文字列全体と一致します。たとえば、manual.doc
mrswadge

5
強化された貪欲トークンでは、ドットは常に先読みの後に来る必要があります:(?:(?!\\).)+。(ref)また、RegExrの例では、2つの円記号を使用してパスコンポーネントを分離しています。1つだけ存在し、正規表現は1つだけに一致する必要があります。(デモ
アランムーア

62

私のために働いたのは:

.+(\\.+)$

オンラインでお試しください!

説明:

.+     - any character except newline
(      - create a group
 \\.+   - match a backslash, and any characters after it
)      - end group
$      - this all has to happen at the end of the string

15
パーツを分解してくれてありがとう:)
Jason Bruce

1
最後のスラッシュ(/)に一致する正規表現を具体的に探していました。@stemaによる上記の受け入れられた答えは、バックスラッシュがフォワードスラッシュに置き換えられたときに機能することがわかります。Yoursはすべてのスラッシュに続くすべてに一致しますが、これは実際には求められているソリューションではありません。あなたの解決策は実際にはうまくいかなかったが、あなたの説明は簡潔であったので、私はあなたの答えを賛成した
Chidozie Nnachor

これは、ラインで中断されない限り、ネガティブルックアヘッドよりもはるかに単純で一般的に優れていますが、なぜ複雑すぎるのですか?
スコットアンダーソン

42

否定的な先読みは正解ですが、次のようにすっきりと書くことができます。

(\\)(?!.*\\)

これは、\の出現を検索し、一致しないチェックで、任意の数の文字と、その後に表示したくない文字が続く文字を検索します。これは否定的であるため、一致が見つからない場合にのみ一致します。


4
これは最後のバックスラッシュのみに一致します。OPもそれ以降のすべてを一致させたいと考えています。
Alan Moore

非常に役立つ、このよりクリーンなバージョンは、バックスラッシュをキャプチャするだけで、すべてがクリックされました。ありがとうございました。
Matt Binford

27

のように、文字列の最後に固定してみることができ\\[^\\]*$ます。タスクに正規表現を使用する必要があるかどうかはわかりませんが。


1
これは私にとってはうまくいきました。 ([^\/]*)$Linuxボックスのパスにあるファイル名と一致します。^このコンテキストでキャレットがどのように機能するか説明できますか?文字列の始まりを示すためだけに使用したことがあります。
ブラッド

@ブラッド、それは否定です。意味は[^\/]、を除くすべての文字に一致します/
マイケルクレリン-ハッカー、2014年

9

この正規表現はどうですか: \\[^\\]+$


まあ私はそれが正規表現にある必要があるとは思わない。しかし、私は私の答えを編集します
SERPRO

エラー...正規表現である必要はないと思いますが、確かにそれを含めるには一致する必要があります。重要ではありません。あなたの答えを見た後、何が悪いのか考えました反対票が投じられ、これが私が思いついたものなので、コメントしました。
マイケルクレリン-ハッカー

私はあなたのコメントに感謝間違って私を得ることはありません@michael、私はちょうどそれが正規表現で\それを追加する必要がありますないと思った;)
SERPRO

5

バックスラッシュを含めたくないが、その後のテキストのみを含めたい場合は、これを試してください:([^\\]+)$またはunixの場合:([^\/]+)$


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