折扣面具与正则表达式

时间:2012-06-02 15:37:48

标签: c# regex

是否可以创建一个“动态”折扣掩码,将%或数字作为折扣值?这样做的简单方法是什么?  valide输入的样本:-25%或0.25或-5 $不是0和点后的两位数

2 个答案:

答案 0 :(得分:0)

尝试

@"(\+|-)?(\d+(\.\d*)?|\.\d+)%?"

它会找到:

123.23
12.4%
.34
.34%
45.
45.%
8
7%
34
34%
+2.55%
-1.75%

<强>更新

和......

@"(\+|-)?(\d+(,\d{3})*(?!\d)(\.\d*)?|\.\d+)%?"

...您也可以包含数千个分隔符。


我必须承认我的第二个正则表达式看起来像一只猫走过我的键盘。这里的解释

(\+|-)?可选?加号或减号。

\d+(,\d{3})*(?!\d)(\.\d*)?一个或多个数字\d+后跟任意数千个分隔符加上三个数字(,\d{3})*,后面没有任何数字(?!\d),以便禁止四位数字序列,可选地后跟小数点和任意数量的数字(\.\d*)?

|\.\d+或者小数点后跟至少一位数。

%?最后是一个可选的百分号。

答案 1 :(得分:0)

如果我理解你的问题,你需要这样的事情:

@"^[+-]?(?:\d*\.)?\d+[%$]?$"

这部分取决于你-5$的例子。通常情况下,$会出现在前面,所以你需要这样的东西:

@"^(?:\$(?!.*%))?[+-]?(?:\d*\.)?\d+%?$"

这将允许$-5.0010+20%,但阻止$5%

编辑:

运行 Olivier 的允许使用逗号的想法:

@"^(\$(?!.*%))?[+-]?(\d{1,3}((,\d{3})*|\d*))?(\.\d+)?\b%?$"

扩展以便于理解:

@"^               #Require matching from the beginning of the line
(\$(?!.*%))?      #Optionally allow a $ here, but only if there's no % later on.
[+-]?             #Optionally allow + or - at the beginning
(
  \d{1,3}         #Covers the first three numerals
  ((,\d{3})*|\d*) #Allow numbers in 1,234,567 format, or simply a long string of numerals with no commas
)?                #Allow for a decimal with no leading digits    
(\.\d+)?          #Optionally allow a period, but only with numerals behind it
\b                #Word break (a sneaky way to require at least one numeral before this position, thus preventing an empty string)
%?                #Optionally allow %
$"                #End of line