2010-08-24 120 views
0

我需要正则表达式的帮助,匹配和替换模式。我正在处理费率问题。
我的速度能像正则表达式帮助

345.00 
456 
2345.90 
341.34 

我要检查率9结束,如果不是我要结束与9的速度和$符号。

运行规则后的利率应该成为

$349.00 
$459.00 
$2349.00 
$339.00 

我存储率字符串,所以,当我使用Regex.IsMatch功能,它会很容易。

有人可以给我比赛模式和替换模式的正则表达式。

我正在为此挣扎半天,需要帮助。

感谢 萨贾塔

+0

为什么你必须使用正则表达式? – NullUserException 2010-08-24 23:19:10

回答

0

我会使用多个正则表达式模式,因为这似乎并不像它有一个很大的投入工作:

首先,让我们摆脱浮动:

s/\..*$// 

那么,让我们来处理 '9':

s/.$/9/ 

最后,广告d的“$”和” .00' :

s/^/$/ 
s/$/.00/ 
+0

肯定有一个“更好”的解决方案,就像更小的一样,但是你必须使用回溯和保存的匹配,这通常对大多数正则表达式引擎实现的NFA没有太大的好处。 – polemon 2010-08-24 23:17:55

+0

谢谢你的答案 – ksr81 2010-09-16 18:13:15

1

一种更简单,更直观的方法是使用整数运算:

// convert amount to int, then: 
amount = amount - (amount % 10) + 9 
// or more succintly 
amount += 9 - (amount % 10) 

这会给你想要的东西。然后,您可以使用String.Format()来获得货币格式:

public static String ToMoney(string amount) 
{ 
    int x = Convert.ToInt32(double.Parse(amount)); 
    x += 9 - (x%10); 
    return String.Format("{0:C}", x); 
} 

看到它在行动上ideone

1
string[] ss = { "345.00", "456", "2345.90", "341.56" }; 

foreach (string s in ss) 
{ 
    Console.WriteLine(Regex.Replace(s, @"^(\d*)\d(?:\.\d+)?$", 
            @"$$${1}9.00")); 
} 

输出:

$349.00 
$459.00 
$2349.00 
$349.00 

最初,(\d*)比赛尽可能多的数字作为它可以将它们存储在捕获组#1中(例如,它匹配中的)。然后它退出一个位置,让\d匹配最后一位数字(组#1现在只包含34)。最后,如果有一个(.56,在这种情况下)(?:\.\d+)?匹配分数。

在替换中,$$插入一个美元符号($在替换中有特殊含义,因此您必须用另一个$将其转义)。 ${1}插入捕获组#1的内容(在341.56的情况下为34)。通常情况下,您只能使用$1,但是这次组参考后面跟着另一个数字,因此它看起来像我指的是组#19。围绕着1的大括号明确告诉我我想要1号组,然后是9。最后,.00完成替换。

你想出的正则表达式使用了命名捕获组,所以你使用${price1}而不是${1}来插入数字的第一部分。其他两个捕获组不需要。事实上,那里有很多东西并不属于真正的属性。我看到你现在正在移除小数部分,而不是用.00替换它。

还有一件事:在开始替换之前,您不需要拨打IsMatch();这由Replace()方法处理。

+0

+1这个解释...太棒了! – opatut 2010-08-25 21:16:06