2010-10-28 148 views
1

(\d+(?:\.\d+)?)\D*$ - 此正则表达式中提取价格从带小数点的任何字符串,但我想提取小数点时,才会有东西,但不为零时,有300.50或300.25那么小数点应被提取,但就像如果有是300.00,那么不应该提取小数点,该怎么办?正则表达式价格

这是确定的,或任何更好的解决方案是存在的?

Match match = Regex.Match(cellRecord, @"(\d+(?:\.\d+)?)\D*$"); 
price = match.Groups[1].Value.ToString().Trim(); 
if (price.Substring(price.Length - 3, 3) == ".00") 
{ 
    price = price.Replace(".00", ""); 
} 
+0

我不知道语法是什么'(?:\ \ d +)'......如果你能使其更常用的正则表达式,(更“正规”的正则表达式...),也许更多的人知道答案。 – 2010-10-28 05:24:29

+2

将它加载到Decimal(Decimal.Parse(...))并在输出时决定字符串的格式会更好吗?解析VS域模型vs演示文稿,还挺。 – sisve 2010-10-28 05:46:30

回答

0

这个正则表达式应该适用于你提到的输入。请看下面的输出。

"\b(\d+(?:\.(?:[^0]\d|\d[^0]))?)\b" 

的工作原理如下

input OPTIDX 26FEB2009 NIFTY CE 2800 
output 2800 

input 123.00 
output 123 

input 123.06 
output 123.06 

input 123.50 
output 123.50 
1

通过更好的方式假设你的意思是“可以一个正则表达式做到这一点对自己?”那么:

([0-9]+(?:\.(?:[1-9][1-9]|[0-9][1-9]|[1-9][0-9]))?)(?=[^0-9]) 

将在第一个正则表达式分组中放置匹配项。这个正则表达式所做的是匹配任何数字,然后是“美分”部分,允许除00之外的任何数字组合。还要注意,这与“美分”部分中的两位数字匹配。

注意,此正则表达式使用[0-9],而不是\ d,使其更清晰一点,其数字是可以接受的。

编辑:请注意,这个正则表达式在GNU/Emacs中测试,而不是C#,但我认为这种情况没有任何区别。

编辑:我犯了一个小错误,正则表达式匹配'300'。不是'300',调整后的正则表达式只会在有匹配的情况下对期间进行分组。

+0

+1非常感谢你,它的伟大工程.. – Harikrishna 2010-10-28 11:57:07

+0

它不OPTIDX 26FEB2009 NIFTY工作CE 2800它以日期这里比赛就像26 – Harikrishna 2010-10-28 12:57:49

+0

@Harikrishna你原来的问题给出了非常具体的输入条件,这个问题是进入问题的具体细节。例如,如果您知道所有“时间”值后面跟着空格,您可以调整正则表达式的正向超前部分...即[(?= [^ 0-9])'可以更改为'(?= \ S)'。只有当“时间”后面跟着一个空格,而不是时间后面跟着一个数字时,才会发生匹配。或者,您可以排除所有与“(?= [^ 0-9a-zA-Z])匹配的字母数字字符''。 – nixeagle 2010-10-28 21:19:50

3

我也将调查使用Double.Parse与正确的文化信息 - 这是usally一定比用自己的正则表达式更简单,更稳定。