0

私の文字列は

http://www.test.com\r\nhttp://www.hello.com<some text here>http://www.world.com

文字列内のすべてのURLを抽出したい。出力は次のようになります。

http://www.test.com
http://www.hello.com
http://www.world.com

どうすればそれを達成できますか?

文字列にはhtmlタグがないため、HTMLAgilityPackを使用してそれらを抽出することは実行可能なオプションではありません。

4

3 に答える 3

3

他の回答やコメントの中で、私が実際に実装できる最も簡単なアプローチは分割方法です。あなたはここに多くの盲目的な推測があることを知っています、そしてそれをすべて取るための最善の策の1つはこれかもしれません:

using System.Text.RegularExpressions;

public static List<string> ParseUrls(string input) {
    List<string> urls = new List<string>();
    const string pattern = "http://"; //here you may use a better expression to include ftp and so on
    string[] m = Regex.Split(input, pattern);
    for (int i = 0; i < m.Length; i++)
        if (i % 2 == 0){
            Match urlMatch = Regex.Match(m[i],"^(?<url>[a-zA-Z0-9/?=&.]+)", RegexOptions.Singleline);
            if(urlMatch.Success)
                urls.Add(string.Format("http://{0}", urlMatch.Groups["url"].Value)); //modify the prefix according to the chosen pattern                            
        }
    return urls;
}
于 2012-07-28T22:30:32.543 に答える
0

「:」はURL内の有効な文字ではないため、「http://」を検索すると、URLの適切で有効な開始が表示されると見なすことができます。

これを検索して、あなたのスタートを見つけてください。

遭遇する可能性のある既知の良好なTLDのリストを作成できます(これは役立ちます:http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

あなたはこれがあなたの終点になることを知っています。したがって、文字列の先頭からこれらを検索できます。

最初から始めて、このインデックスから始めてください。それ以降はすべてスキップしてください、それは良くありません。

サブディレクトリがないと思います。あなたはそれらのどれもリストしていなかったので。

于 2012-07-28T22:04:49.663 に答える
0

「http://」を検索して分割することにより、この質問の文字列分割ロジックを使用できます。「http://」の部分が必要な場合は、後でいつでも追加できます。

編集:後で各URLの最後で\ r \ nを検索してフィルタリングする必要があることに注意してください。ただし、これは大きな問題ではありません...

于 2012-07-28T22:05:16.120 に答える