2011-10-18 3 views
0

で始まる:正規表現の検証と文字列を抽出し、私は、以下の条件での正規表現の作成に取り掛かる方法を知りたいのですが、10進数または分数

  1. 文字列は、10進数または分数
  2. で開始する必要があります。
  3. 小数点は正で小数点以下2桁までとします。
  4. 分数は、それ自身または1つの整数と小数部の小数部、つまり1 1/2、3/4で、スペースで区切る必要があります。 誰かがそれはそれは私が文字列の小数点以下のいずれかで始まることを検証する場合と1 1/2ではなく、必要な
  5. リスト項目

だろう新しいことを1と1/2を書いた場合(クールだろうまたは画分とそれのうち値

有効な例

"1 cup" = VALID = Extracted values: (1) (cup) 
".5 cup" = VALID = Extracted values: (0.5) (cup) 
"1.0 cup" = VALID = Extracted values: (1.0) (cup) 
"1.10 cup" = VALID = Extracted values: (1.10) (cup) 
"1/2 cup" = VALID = Extracted values: (1/2) (cup) 
"1 1/2 cup" = VALID = Extracted values: (1 1/2) (cup) 
"1 and 1/2 cup" = VALID = Extracted values: (1 1/2) (cup) 
"1 and a 1/2 cup" = VALID = Extracted values: (1 1/2) (cup) 
"1 & 1/2 cup" = VALID = Extracted values: (1 1/2) (cup) 

無効な例として抽出します

"1 1/2 1/4 1/4 cup" = INVALID (only allow whole and fraction, or one fraction) 
"1.034 cup" = INVALID (2 decimal places only)  
"cup 1/2" = INVALID (not the start of the string) 

EDIT 私がこれまで持っている:

解析する画分:

\d*\s*(and*|and a*|\s*)\d+\/?\d*(.*)$ 

解析小数:

^\d{0,2}(\.\d{1,2})?$ 

マイ組み合わせたバージョン:

(\d*\s*&|and*|and a*|\s*\s*\d+\/?\d*)|(\d{0,2}\.\d{1,2})*(.*)$ 

おかげ

よろしくDotnetShadow

、ちょうど適切に2に参加する方法がわからない、それはそれがより良い最適化することができ?,および無効1はまだ任意の助けをいただければ幸いです

を解析

+0

私は、これまで役に立ったことを含めて私の投稿を編集しました – DotnetShadow

答えて

3

(テストするRegex Heroを使用して)上記のあなたの例で私のために、次の作品:

^(?<WholeNumber>\d+){0,1}(?:\s(?<JoinWord>&|and|and\sa)?\s?)?(?<Decimal>\.\d{1,2})?(?<Fraction>(?<Numerator>\d+)\/(?<Denominator>\d+)){0,1}(?:\s(?<Unit>cup))$ 

さまざまなコンポーネントに名前付きのキャプチャグループを使用していることに気付くでしょう。私はそれをあなたに残して、グループを解析し、有意義に結合します(例えば、小数点の値を100で割った値に整数全体を加え、分子の値を分母で割ったものを加える)。

他のサポートされている「ユニット」と他のサポートされている「joinWord」のパターンを追加することもできます。

編集:私のコメントに従って私の提案を追加しました。

+0

そして、実際には、数字部分全体に(? \ d +)を使用するかもしれません... – Reddog

+0

おそらく最初の "\ s" (空間)を "JoinWord"キャプチャグループに何とかしています。 – Reddog

+0

ありがとう、まさに私が後にしてくれたこと、大変感謝しています。私はこれから多くを学ぶことができます – DotnetShadow

1

私はこの問題を解決する正規表現が必要と思わないです。

  1. 書き込み関数文字列が有効な小数点であるかどうかをチェックするIsFraction(文字列s)(3/2など)?
  2. スプリット入力文字列で、最後の項目が何らかの種類の番号でないことを確認します。
  3. リストから非数および非小数の項目をすべて削除します。
  4. 残りのアイテム数が3未満であることを確認します。
  5. アイテム数が2の場合、最初は自然数、2番目は小数です。 - > result
  6. countが1の場合は、それが小数または小数であることを確認します。 - >結果

初期の書き込みにはもっと時間がかかりますが、維持と拡張が容易です。

P.S. int.TryParsedecimal.TryParseIsFractionとの間に使用してください。

+0

すてきな代案をお寄せいただきありがとうございます – DotnetShadow

関連する問題