2016-05-19 8 views
0

私は内部にいくつかのURLを持つテキストを持っています。 HTTPと C#正規表現。 lookbehindのOR条件

  • www.website-link.ch:プロトコル例のないURLの

    1. の3種類が存在する場合があります。します。https:例:のhttp:httpsの例で// www.website-link.ch
    2. // www.website-link.ch

    私は(すべてのURLからアドレス部分を取得する必要がありますex:website-link.ch)。そのためには、何かが 'www'で始まる場合、正式なlookbehindを持つ正規表現が必要です。 またはと 'http:// www。' またはと「https:// www。」

    OR条件をポジティブなビヘイビアの内側に置くことは可能ですか?私にとってはうまくいかず、私はこのモンスターだけを作りました。

    string pattern = @"((?<=http://www\.).*\b)|((?<=https://www\.).*\b)|((?<=www\.).*\b)"; 
    

    パターンをスマートにすることは可能ですか?

  • +0

    私はこれを正しく理解していないことを確認。何を正確にキャプチャしたいですか? 'www.'、' http:// www'、 'https:// www.'を持っているかどうかにかかわらずurl' website-link.ch'? – Nasreddine

    +1

    私は最近、同じことをしなければなりませんでした。私は2つの異なる正規表現を使ってそれをやった。これはhttp/httpsに使用されます。 – Jacobr365

    +1

    ['www。(。*)\ ')を使用することはできません。 b'](https://regex101.com/r/rY0hR3/1) – AKS

    答えて

    1

    この場合、プロトコルと "www。"を使用するだけで、ルックバックの使用を避けることができます。パーツはキャプチャされていないグループに属しています。

    var regex = new Regex(@"(?:(?:https?://)?www\.)(.*\b)"); 
    

    Regular expression visualization

    Debuggex Demo

    他のすべてのグループが非キャプチャ(?:)構文を使用しているためのみ(.*\b)にマッチしたテキストがキャプチャされます。

    (「WWW。」なし)ウェブサイトのアドレスのホスト名が一致の捕捉グループをチェックアウトすることによってアクセスすることができる。

    var hostnameMatch = regex.Match("http://www.website-link.ch").Groups[1]; 
    if (hostnameMatch.Success) 
        Console.WriteLine("Matched: {0}", hostnameMatch.Value); // Outputs "Matched: website-link.ch" 
    

    MSDNは、各マッチグループのために利用可能な特性に一部more informationを有します。

    1

    文字列を解析して部分を区切る組み込みの機能を持つSystem.UriBuilderクラスを使用することもできます。例えば

    using System; 
    
    public class Program 
    { 
        public static void Main() 
        { 
         var s = "www.website-link.ch"; 
         var builder = new UriBuilder(s); 
         if (builder.Scheme == Uri.UriSchemeHttps) 
         { 
          Console.WriteLine("String starts with `https`"); 
         } 
    
         Console.WriteLine("String does not start with `https`"); 
        } 
    }