指定されたパターン以外のすべてを取得する正規表現を作成しようとしています。私はネガティブルックアヘッドを使おうとしていますが、式をテストするときはいつでも機能しません。
この形式のファイルがあります:
(ガベージ情報)ファイル名(その他のガベージ).extensionまたは[ガベージ情報]ファイル名[その他のガベージ] .extension
たとえば、ファイルの1つは、[O2CXDR]レポート1月[77012] .pdfまたは(XEW7CK)販売手数料(99723).xlsです。
Cでregex.hライブラリを使用しているので、POSIXライブラリだと思います。
「filename」と「.extension」を抽出して、filename.extensionファイルを作成するスクリプトを記述できるようにしたいと考えています。
これまでのところ、角かっことその周りのスペースでガベージ情報を選択する式がありますが、残りを選択することはできません。
\s*(\[|\().*?(\]|\))+\s*
そして私が試したネガティブな先読みは:
.*(?!(\s*(\[|\().*?(\]|\))+\s*)).*
しかし、それは1回の一致ですべてを選択するだけです。
私は先読みと後読みを正しく理解していないと確信しています。式を修正するにはどうすればよいですか?私は少し迷っているので、誰かがそれらがどのように機能するかを説明できますか?ありがとう!
あなたが正規表現エンジンを指定していないので、私はタグを使用することができサブセットをターゲットだろう\K
、\G
と\A
(のようなPCRE)。
以下では、一致リセット(\K
)、強化された貪欲なトークン、および一致の開始(文字列の開始なし)の組み合わせを使用\G(?!\A)
します。これについては、以下でさらに説明します。
注:空の一致を削除します
\s*[[(].*?[])]\s*\K|\G(?!\A)(?:(?!\s*[[(].*?[])]\s*).)+
\s*
任意の空白を何度でも一致させる[[(]
[
またはのいずれかに一致(
.*?
任意の文字を何度でも一致させますが、できるだけ少なくします(レイジーマッチング)[])]
]
またはのいずれかに一致)
\s*
任意の空白を何度でも一致させる\K
試合のリセット-正規表現内の指定された位置を試合の新しい開始として設定します。これは、このタグの前にあるものは、試合全体でキャプチャされないことを意味します。\G(?!\A)
検索の開始点または前回の正常な一致終了の位置でのみ一致し、文字列の開始点では一致しません。(?:(?!\s*[[(].*?[])]\s*).)+
負の先読みパターン(最初のオプションと同じ)を除いて、複数回一致する強化された貪欲なトークン。この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加