入力文字列を解析し、そこから値を抽出します。私の入力文字列には、週、日、時、分があります。正規表現の名前付きグループ
ので、入力文字列が5日2時間
- 1週間かもしれません
正規表現を使用して値を抽出したいとします。
どのように私は.Netでこれを達成できますか?
入力文字列を解析し、そこから値を抽出します。私の入力文字列には、週、日、時、分があります。正規表現の名前付きグループ
ので、入力文字列が5日2時間
正規表現を使用して値を抽出したいとします。
どのように私は.Netでこれを達成できますか?
次の正規表現は、アイテムが順番に並んでいる限り、単数または複数(たとえば、日または日)に一致します。
//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);
私は正規表現を使用するとこれには多少の不満があると思います。私があなたの場合は、文字列をトークン化し、小文字に変換して別の単語に切り替えます。既知の部分文字列を修正した状況を処理する方がはるかに良い方法です。
+1これは私が今投稿したかったものです。 – Gumbo
+1ハードコア正規表現のユーザーから、これは複数の正規表現正規表現になるので、正規表現にはあまり適していません。代わりのスペルやその他の論理を強くしようとすると、それを維持するのは難しいでしょう。本当に興味があるのであれば、クロノスと呼ばれるルビーで書かれたライブラリがあります。このライブラリは、この種の入力を具体的に行います。 – DevelopingChris
正規表現内のキャプチャグループは、角カッコで囲みます(例:"(\d+ Week)"
)。
名前付きキャプチャグループは、疑問符と名前「"(?<week>\d+ Week)"
」を使用して実行されます。
これらは、次に、m.Groups("week").Value
として返されます。
フル正規表現(未テスト)は次のようになります。
(?<weeks>\d+ weeks?)\s*(?<days>\d+ days?)\s*(?<hours>\d+ hours?)\s*(?<minutes>\d+ minutes?)
をここではさまざまな値のためにそのテキストを解析する方法の大まかな例です。
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
いつも順調でしょうか? – stevehipwell