正则表达式验证并提取以小数或分数开头的字符串

时间:2011-10-18 02:53:40

标签: c# regex

我想知道如何创建具有以下条件的正则表达式:

  1. 字符串必须以小数或分数
  2. 开头
  3. 十进制应为正数,最多2位小数
  4. 分数应该是它自己的一个分数或一个整数和分数,即1 1 / 2,3 / 4,并用空格分隔。 (如果有人写了1和1/2可能会很酷,它会是1 1/2但不是必需的
  5. 列表项
  6. 我要验证一个字符串以小数或分数开头并从中获取提取值

    有效示例

    "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)
    

    修改 到目前为止我所拥有的:

    解析分数:

    \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})*(.*)$
    

    只是不知道如何正确加入2并且它可以更好地优化?,而无效的仍然可以解析

    感谢任何帮助,谢谢

    问候DotnetShadow

2 个答案:

答案 0 :(得分: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”添加其他模式。

已修改:根据我的评论添加了我的建议。

答案 1 :(得分:1)

我认为你不需要正则表达式来解决这个问题。考虑以下解决方案:

  1. 写函数IsFraction(字符串s)检查字符串是否是有效分数(例如,它可以是3/2吗?)。
  2. 拆分输入字符串,检查最后一项是否为任何类型的数字 - 即单位。
  3. 从列表中删除所有非数字和非分数项目。
  4. 确认剩余物品数量少于3个。
  5. 如果项目数为2,则首先验证是自然数,第二个是分数。 - &GT;结果
  6. 如果count为1,请验证它是分数还是小数。 - &GT;结果
  7. 更多时间(可能)用于初始写作,但更容易维护和扩展。

    P.S。在int.TryParse内使用decimal.TryParseIsFraction