貪欲な正規表現を持つオプションの接尾辞を無視する
-
07-07-2019 - |
質問
.NETで次のような文字列に対して正規表現マッチングを実行しています:
1;#Lists/General Discussion/Waffles Win 2;#Lists/General Discussion/Waffles Win/2_.000 3;#Lists/General Discussion/Waffles Win/3_.000
URL部分を最後の数字なしで一致させる必要があるので、これを取得します:
Lists/General Discussion/Waffles Win
これは私が試みている正規表現です:
(?:\d+;#)(?<url>.+)(?:/\d+_.\d+)*
問題は、最後のグループが中間グループの一致の一部として含まれていることです。最後に*なしで試しましたが、上の最初の文字列のみが一致し、残りは一致しません。
複数行オプションが有効になっています。アイデアはありますか?
解決
いくつかの異なる選択肢:
@"^\d+;#([^/]+(?:/[^/]+)*?)(?:/\d+_\.\d+)?@"^\d+;#([^/]+(?:/(?!\d+_\.\d+$)[^/]+)*)"
quot;
これは、可能な限り少ないパスセグメントに一致し、オプションの最後の部分と行の終わりが続きます。
@"^\d+;#(.*?)(?:/\d+_\.\d+)?<*>quot;
これは、行末の数字部分でない限り、できるだけ多くのパスセグメントに一致します。
<*>これは、可能な限り少ない文字数に一致し、その後にオプションの最後の部分と行末が続きます。
他のヒント
試すことができます
^(\d+;#)([^/]+(/[^\d][^/]*)*)
、2番目のグループを取得します。最初のグループは 1;#
;と一致します2番目のグループは最初の部分またはURL(/以外の任意の文字を含むと想定)に分割され、その後、/の任意の数のグループと一致し、その後に数字以外が続き、/以外が続きます。
このサイトでテストされ、希望どおりに動作しているようです。さらにいくつかのサンプルを試してみてください。
所属していません StackOverflow