我想知道如何创建具有以下条件的正则表达式:
我要验证一个字符串以小数或分数开头并从中获取提取值
有效示例
"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
答案 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)
我认为你不需要正则表达式来解决这个问题。考虑以下解决方案:
更多时间(可能)用于初始写作,但更容易维护和扩展。
P.S。在int.TryParse
内使用decimal.TryParse
和IsFraction
。