C#のシンプルな正規表現ヘルプ
質問
正規表現を使用して回復できる情報を含む未完成のバイナリファイルがあります。内容は次のとおりです。
G $ 12.Angry.Men.1957.720p.HDTV.x264-HDLH Lhttp://site.com/forum/f89/12-angry-men-1957-720p-hdtv-x264-hdl-538403/ LI < !>#352; M、ABBA.The.Movie.1977.720p.BluRay.DTS.x264-iONN Phttp://site.com/forum/f89/abba-movie-1977-720p-bluray-dts-x264-ion-428687/ <! > amp;
どのように解析すれば、少なくともlinks
を取得できます。
http://site.com/forum/f89/abba-movie-1977-720p-bluray-dts-x264-ion-428687/
428687
はid
番号です。
つまり、full link
とLINKS
があります。
前に来る他の名前はリンクの名前です:
ABBA.The.Movie.1977.720p.BluRay.DTS.x264-iON
これらを解析できるかどうかはわかりませんが。 NAMES
と<=>の前後にすべて文字があります。おそらくこれで問題を絞り込むことができますか?
ところで、正解に対して500バウンティを差し上げます。
解決
次の正規表現のようなものですか?
MatchCollection matches = Regex.Matches(yourString, @"http://\S+?-(\d+)/")
foreach(Match m in matches)
{
string id = m.Captures[0].Value;
string url = m.Value;
}
リンクを取得し(http://
で始まる)、スペースではないすべてのもの(スペースはHTTP(URI)リンクではないことが保証されます)、数字と末尾のスラッシュで終わると仮定します(これは&
を正しく削除しますあなたの例または他の末尾のテキストで)。
編集:マッチ全体がリンクであり、IDは最初のキャプチャ括弧内にあり、情報を取得する方法を示すためにコードを更新しました。
更新: URLでダッシュ+数字+スラッシュが複数回発生する可能性がある場合は、貪欲さを使用する必要がありますが、連続するリンク(スペースを含む追加テキストなし)は一致します。ダッシュ+数字+スラッシュがURLごとに1回だけ発生する場合、遅延が優先されます。これは、現在上記のコードにある解決策です。
代替アプローチ
更新と追加情報から、私はテキストについて多くの不明確な点があることを理解しています。別のアプローチの方が簡単かもしれません:<=>ですべてを分割し、結果を確認します。これにより、複雑なルックフォワード/バックワード正規表現を作成する必要がなくなり、連続するリンク(つまり、間にテキストがない)が正しく処理されるようになります。
// zero-width split:
string[] linksWithText = Regex.Split(yourString, @"(?<=http:\S+-\d+/)");
foreach (string link in linksWithText)
{
Match m = Regex.Match(link, @"(.*)(http:\S+-(\d+)/)$");
if (m.Success)
{
string text = m.Groups[1].Value;
string url = m.Groups[2].Value;
string id = m.Groups[3].Value;
}
}
更新:代替アプローチが更新されました。テキスト(名前)が最初で、次にURLです。表現の背後にあるネガティブな外観に注意してください。幅がゼロのスポットで分割され、URLの前をURLの最後まで取得します。
他のヒント
すべてのURLがハイフンで終わり、その後に任意の数字が続き、その後にバックスラッシュが続くと仮定します。これは動作する可能性があります。
`http://[^ ]*-?<id>(\d)+/`
あなたはどう思いますか
更新:これを試してください:-
http://(?!http://)[^ ]*-?<id>(\d)+/
2つのURLに一致するURLを停止するために更新されたコード(?!http://)は、スペースではないURLの中間にあるデータと連結されます。
キャプチャしたグループを名前で取得できます。検索全体が一致したURLになり、グループがIDに一致します。