2

私は正規表現の初心者です。解析したいユーザーエージェント文字列がたくさんあります。

Windows Phone サーチ (Windows Phone OS 7.10;Acer;Allegro;7.10;8860)
Windows Phone サーチ (Windows Phone OS 7.10;HTC;7 Mozart T8698;7.10;7713)
Windows Phone サーチ (Windows Phone OS 7.10;HTC;Radar C110e; 7.10;7720)

正規表現を使用して抽出するにはどうすればよいですか:

A) Windows Phone OS 7.10 Acer Allegro

B) Windows Phone OS 7.10 HTC 7 モーツァルト

C) Windows Phone OS 7.10 HTC レーダー

次の方法で使用しようとしSplitましたが、役に立ちませんでした。

private static string parse(string input) 
{ 
    input = input.Remove(0, input.IndexOf('(') + 1).Replace(')', ' ').Trim(); 
    string[] temp = input.Split(';'); 
    if (temp[2].Contains('T'))
    { 
        temp[2] = temp[2].Substring(0, temp[2].IndexOf('T')).Trim(); 
    } 
    StringBuilder sb = new StringBuilder(); 
    sb.Append(temp[0] + " "); 
    sb.Append(temp[1] + " "); 
    sb.Append(temp[2]); 
    return sb.ToString(); 
}
4

2 に答える 2

1

この正規表現はそれをキャプチャします:

(?<=\().*?;.*?;.*?(?=;)

コードとしては次のようになります。

string s = Regex.Match(input, @"(?<=\().*?;.*?;.*?(?=;)").Value

正規表現の内訳として:

  • (?<=\()= 前の文字が文字通りの開き括弧であると断言する「後読み」(
  • .*?;=;次までのすべての (貪欲でない - スキップしない) 一致;
  • (?=;)= 次の文字が文字通りのセミコロンであることをアサートする「先読み」;
于 2013-07-12T15:25:45.993 に答える
1

あらゆる種類のテキストを解析するように特別に設計されているため、正規表現を使用します。正規表現パターンの基本を理解すると、あらゆるテキスト状況で非常に役立ちます。

このパターンでの私の目標は、各項目をバージョン、電話、タイプ、メジャー、マイナーの名前付きキャプチャ グループに分けることです。正規表現処理によってそれが完了すると、Linq を使用して、示されているようにデータを抽出できます。

string @pattern = @"
(?:OS\s)                     # Match but don't capture (MDC) OS, used an an anchor
(?<Version>\d\.\d+)          # Version of OS
(?:;)                        # MDC ;
(?<Phone>[^;]+)              # Get phone name up to ;
(?:;)                        # MDC ;
(?<Type>[^;]+)               # Get phone type up to ;
(?:;)                        # MDC ;
(?<Major>\d\.\d+)            # Major version
(?:;)
(?<Minor>\d+)                # Minor Version
";

string data =
@"Windows Phone Search (Windows Phone OS 7.10;Acer;Allegro;7.10;8860)
Windows Phone Search (Windows Phone OS 7.10;HTC;7 Mozart T8698;7.10;7713)
Windows Phone Search (Windows Phone OS 7.10;HTC;Radar C110e;7.10;7720)";

 // Ignore pattern white space allows us to comment the pattern, it is not a regex processing command
var phones = Regex.Matches(data, pattern, RegexOptions.IgnorePatternWhitespace)
                  .OfType<Match>()
                  .Select (mt => new
                  {
                    Name = mt.Groups["Phone"].Value.ToString(),
                    Type = mt.Groups["Type"].Value.ToString(),
                    Version = string.Format( "{0}.{1}", mt.Groups["Major"].Value.ToString(),
                                                        mt.Groups["Minor"].Value.ToString())
                  }
                  );

Console.WriteLine ("Phones Supported are:");

phones.Select(ph => string.Format("{0} of type {1} version ({2})", ph.Name, ph.Type, ph.Version))
      .ToList()
      .ForEach(Console.WriteLine);

/* Output
Phones Supported are:
Acer of type Allegro version (7.10.8860)
HTC of type 7 Mozart T8698 version (7.10.7713)
HTC of type Radar C110e version (7.10.7720)
*/
于 2013-07-12T17:29:43.483 に答える