2009-07-07 19 views
1

入力文字列を解析し、そこから値を抽出します。私の入力文字列には、週、日、時、分があります。正規表現の名前付きグループ

ので、入力文字列が5日2時間

  • または3分
  • 、5日1分1分
  • 時間または2時間など
    • 1週間かもしれません

    正規表現を使用して値を抽出したいとします。

    どのように私は.Netでこれを達成できますか?

    +1

    いつも順調でしょうか? – stevehipwell

    答えて

    2

    次の正規表現は、アイテムが順番に並んでいる限り、単数または複数(たとえば、日または日)に一致します。

    //Set the input and pattern 
    string sInput = "1 Weeks 5 Days 2 Hours 1 Minutes"; 
    string sPattern = "^\s*(?:(?<weeks>\d+)\s*(?:weeks|week))?\s*(?:(?<days>\d+)\s*(?:days|day))?\s*(?:(?<hours>\d+)\s*(?:hours|hour))?\s*(?:(?<minutes>\d+)\s*(?:minutes|minute))?"; 
    
    //Run the match 
    Match oMatch = Regex.Match(sInput, sPattern, RegexOptions.IgnoreCase); 
    
    //Get the values 
    int iWeeks = int.Parse(oMatch.Groups["weeks"].Value); 
    int iDays = int.Parse(oMatch.Groups["days"].Value); 
    int iHours = int.Parse(oMatch.Groups["hours"].Value); 
    int iMinutes = int.Parse(oMatch.Groups["minutes"].Value); 
    
    4

    私は正規表現を使用するとこれには多少の不満があると思います。私があなたの場合は、文字列をトークン化し、小文字に変換して別の単語に切り替えます。既知の部分文字列を修正した状況を処理する方がはるかに良い方法です。

    +2

    +1これは私が今投稿したかったものです。 – Gumbo

    +0

    +1ハードコア正規表現のユーザーから、これは複数の正規表現正規表現になるので、正規表現にはあまり適していません。代わりのスペルやその他の論理を強くしようとすると、それを維持するのは難しいでしょう。本当に興味があるのであれば、クロノスと呼ばれるルビーで書かれたライブラリがあります。このライブラリは、この種の入力を具体的に行います。 – DevelopingChris

    0

    正規表現内のキャプチャグループは、角カッコで囲みます(例:"(\d+ Week)")。

    名前付きキャプチャグループは、疑問符と名前「"(?<week>\d+ Week)"」を使用して実行されます。

    これらは、次に、m.Groups("week").Valueとして返されます。

    フル正規表現(未テスト)は次のようになります。

    (?<weeks>\d+ weeks?)\s*(?<days>\d+ days?)\s*(?<hours>\d+ hours?)\s*(?<minutes>\d+ minutes?) 
    
    0

    をここではさまざまな値のためにそのテキストを解析する方法の大まかな例です。

    Dim inputString As String = "1 Week 5 Days 2 Hours 1 Minutes" 
    Dim pattern As String = "(?<Week>\d+)\s*week\s*(?<Days>\d+)\s*days\s*(?<Hours>\d+)\s*hours" 
    
    Dim m As Match = Regex.Match(inputString, pattern, RegexOptions.Compiled Or RegexOptions.Singleline Or RegexOptions.IgnoreCase) 
    
    If m.Success Then 
        Dim hours As String = m.Groups("Hours") 
        etc... 
    End If 
    
    関連する問題