2017-04-21 41 views
2

我想匹配double[M|B]成双部分和alpha部分。例如,47.5B350M正则表达式打破字符串转换成浮动/阿尔法部分

这不起作用:使用lookarounds

var numAlpha = new Regex("(<Numeric>^[0-9]*?:\\.[0-9]*)(<Alpha>[a-zA-Z]+)"); 
var match = numAlpha.Match("1.65B"); 

var number = match.Groups["Numeric"].Value; 
var alpha = match.Groups["Alpha"].Value; 
+0

第一:命名组的语法是错误的。第二:你的数字正则表达式意志----它---:尝试:['( \ d +(?:??\ \ d +))(? [A-ZA-Z] +)']( http://regexstorm.net/tester?p=%28%3f%3cNumeric%3e%5cd%2b%28%3f%3a%5c.%5cd%2b%29%3f%29%28%3f%3cAlpha% 3E%5BA-ZA-Z%5D%2B%29&I =%出资16.5亿0D%0a350M) –

回答

1

你的正则表达式中包含几个问题:

  • Named capturing groups形成与(?<Name>pattern)语法
  • “野生” :符号出现
  • 您的号码正则表达式匹配单个.也是。

我建议将其固定于以下方式(见online demo):

var numAlpha = new Regex(@"(?<Numeric>[0-9]*\.?[0-9]+)(?<Alpha>[a-z]+)", RegexOptions.IgnoreCase); 
var match = numAlpha.Match("1.65B"); 
if (match.Success) 
{ 
    var number = match.Groups["Numeric"].Value; 
    var alpha = match.Groups["Alpha"].Value; 
    Console.WriteLine("Number: {0}, Alpha: {1}", number, alpha); // DEMO! 
    // => Number: 1.65, Alpha: B 
} 

注:

  • 如果您需要匹配整个字符串,在开始添加^锚和$末 - @"^(?<Numeric>[0-9]*\.?[0-9]+)(?<Alpha>[a-z]+)$"
  • RegexOptions.IgnoreCase允许使用[a-z]而不是[a-zA-Z]
+0

此正则表达式匹配'.3M'。应该是?也许'\ d +(\。\ d +)?'作为双重模式做得更好。 –

+0

'.3'是一个有效的双倍,不是吗?参见[用正则表达式匹配浮点数](http://www.regular-expressions.info/floatingpoint.html)。表达式是一个缩写(在这里没有指数部分)变体。 –

+0

也许这是有效的 - 我不确定。这就是我要求的原因。但OP可以决定使用哪种模式。对他所犯错误的好解释。 –

1

尝试拆分,可以看到数字和非数字字符的区别:

var items = Regex.Split("47.5B", "(?<=[^0-9.])(?=[0-9])|(?<=[0-9])(?=[^0-9.])"); 
Console.WriteLine(items[0]); 
Console.WriteLine(items[1]); 

输出:

47.5 
B 

在这里演示:

Rextester