正则表达式帮助

时间:2010-08-24 23:08:32

标签: .net regex

我需要正则表达式的帮助,匹配和替换模式。我正在研究费率 我的费率可以像

345.00
456
2345.90
341.34

我必须检查费率是否以9结尾,如果不是,我必须以9和$符号结束费率。

运行规则后的费率应为

$349.00
$459.00
$2349.00
$339.00

我将速率存储为字符串,以便在使用Regex.IsMatch函数时很容易。

有人可以给我matchmattern的正则表达式并替换pattern。

我正在努力解决这个问题半天并需要帮助。

由于 萨贾塔

3 个答案:

答案 0 :(得分: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 :(得分: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中(例如,它与341中的341.56匹配)。然后它退回一个位置,让\d匹配最后一位(组#1现在只包含34)。最后,(?:\.\d+)?匹配分数(如果有分数)(在这种情况下为.56)。

在替换中,$$插入一个美元符号($在替换中具有特殊含义,因此您必须使用另一个$转义它。 ${1}34的情况下插入捕获组#1的内容(341.56)。通常你只能使用$1,但这次组引用后跟替换中的另一个数字,所以看起来我指的是#19组。 1周围的大括号毫不含糊地告诉我我想要小组#1后跟9。最后,.00完成了替换。

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

还有一件事:在开始替换之前,您无需致电IsMatch();由Replace()方法处理。

答案 2 :(得分:0)

我使用多个Regexp模式,因为这似乎不需要处理大量输入:

首先,让我们摆脱浮动:

s/\..*$//

然后,让我们处理'9':

s/.$/9/

最后,添加'$'和'.00':

s/^/$/
s/$/.00/