2011-01-18 14 views
1

整数または倍精度のいずれかを含む初期文字列があり、その後にタイムスケールが続くとします。たとえば、5.5時間や30分などがあります。私がこの形式で受け取るデータは、ユニフォームがないことで有名ではありません。たとえば、5.5時間などのデータを受け取ることができます。追加された完全停止。C#正規表現

私は、しかし、私は、追加の完全な停止/期間の含める可能性に苦しんでいます、このような文字列から整数またはダブルを抽出する方法を求めていました。私は簡単に数字と完全な文字をemptyspaceで置き換えることによって分離することができます。

誰でも助言してください。

ありがとうございました。

+0

あなたが本当に唯一の番号の後に数字やもタイムスケールを抽出したいですか?有効なタイムスケールに制限がありますか? e。チェック対象のリスト? –

+0

私は、プログラムにコード化された事前定義された値との比較に基づいてタイムスケールをチェックします。 string.contains()を使用するだけです。 –

答えて

3
\d+(?:\.\d+)? 

はあなたの条件に一致する必要があります。

\d+ # Match one or more digits 
(?: # Try to match the following group: 
\. # a dot 
\d+ # one or more digits 
)? # End of optional group 

だから、あなたの文字列内のすべての試合反復処理するために:この正規表現は明らかに、1.05E-6のように指数表記の数値とは一致しません

Regex regexObj = new Regex(@"\d+(?:\.\d+)?"); 
Match matchResults = regexObj.Match(subjectString); 
while (matchResults.Success) { 
    // matched number: matchResults.Value 
    matchResults = matchResults.NextMatch(); 
} 

を。

あなたはまた、次のタイムスケールをキャッチしたい場合は、あなたが今

(\d+(?:\.\d+)?)\s*(\w+) 

を使用することができ、試合後、matchResults.Groups[1]は番号が含まれています。 matchResults.Groups[2]には番号に続く単語が含まれ、許可された単語のリストに対してチェックすることができます。この言葉は必須です。 e。それが欠けている場合は、正規表現全体が失敗します - あなたはそれをしたくない場合は、最後に?を追加します。

+0

優れています。これは完全に機能します。ありがとうございました。 –

1

使用(名前の)グループは、必要な情報を抽出する:

(?'val'\d+\.?\d*).*? 

か: ( 'ヴァル' \ D + \ D *?。?)\ +ワット? は作業を行う必要があり、結果は名前付きグループ 'val'にあります。

+1

'。*?'は常に空の文字列と一致します。 –

+0

正しい。 \ w + \で置き換えます。改善する必要があります。 –

1

たぶん、このような何か:

@"\b(\d+(?:\.\d+)?)\s+(?:hours|mins|seconds)\b"