2017-10-16 6 views
0

内の文字列の最後のoccuranceを見つけるために、私は、このデータ 正規表現はURL

|-> http://www.example.com/fr/page-name (09:00:13) 
|-> http://www.example.com/fr/page-name (09:00:19) 
|-> http://www.example.com/fr/page-name (09:01:41) 
|-> http://www.example.com/en/page-name (09:02:29) 

ていると私は、リスト内の最後のURLから (fr|en)を取得する必要があります。この場合、 'en'

私は、.NETを使用していると私は、私はそれがen|fr

/(en|fr)/(?!/(en|fr)/) 

/(en|fr)/(?!.*?/(en|fr)/) 

が続いていないen|frを見つけましたが、それはすべてのURLにマッチするよう、私は何かが欠けてると思った負の先読みを、試してみました。

何か助けていただければ幸いです。

+0

探している文字列とテストしている文字列を逆にして最初の文字列を検索してみませんか? – mikeb

+0

これはログファイルのように見えます。それぞれのURLはそれ自身の行ですか?なぜ最後の行を取り出して解析してみませんか?私たちはあなたが解決しようとしているより大きな問題に対して、より多くの状況を必要とするかもしれません。 – hunteke

+0

正規表現がこのジョブのための最良のツール(または非常に良いツール)であるかどうかは不明です。 –

答えて

2

は、この正規表現を試してみてください:

[^$]+\/(en|fr)\/

Click for Demo

説明:

  • [^$]+ - end-of-the-stringではない任意の文字の1つ以上の出現と一致します。基本的に、私たちはこの
  • \/(en|fr)\/を用いて全テキストブロックの終わりに達している - これは、今(によるバックトラックに)文字列の末尾から
en/囲ま frのいずれかの第一の発生と一致します

または、\/(en|fr)(?=\/.*$)と書くだけで、複数行フラグをオフにしておくことができます。

必要な値は、マッチのグループ1に存在します。

+0

ありがとう、これは完全に動作します。 –

+1

問題を解決した場合は、その答えを忘れずに受け入れてください – Gurman

0

正規表現は、一致する文字列パターンに適していますが、場合によっては過度の攻撃になる可能性があります。あなたはURIに文字列を変換して、URIの最初のセグメントを取得することができますので、私はそのルートで行くと思います:

'Placeholder variable for For/Each 
Dim u As Uri 

'Iterate through each URL 
For Each url As String In urls.Split({Environment.NewLine}, StringSplitOptions.None) 
    'Split the current line by the space character, get the second item, and convert it into a URI 
    u = New Uri(url.Split(" "c)(1)) 

    'Print the language which is the second segment of the URI 
    Console.WriteLine(u.Segments(1)) 
Next 

フィドル:Live Demo

+0

ありがとう、しかし、私が言ったように、私はこのために正規表現を使用するアプリケーションに制約されています。 –