帮助编写正则表达式

时间:2011-03-20 20:27:40

标签: c# regex

我差不多一个月前就问过这个问题here

我正在努力理解正则表达式,但没有任何意义。 SLak在该问题上的解决方案效果很好,但是当我尝试在http://gskinner.com/RegExr/使用正则表达式助手时,它仅在给出正则表达式-2.2,1.1-6.9,2.3-12.8,2.3

时匹配,|(?<!^|,)(?=-)的第一个逗号

换句话说,我找不到一个甚至可以帮助我理解的正则表达式工具。好吧,够抱怨了。我现在正在尝试重写这个正则表达式,以便我可以使用Regex.Split()将字符串2.2 1.1-6.9,2.3-12.8 2.3拆分为-2.21.1-6.92.3-12.82.3

上述问题的不同之处在于现在可以存在前导和/或尾随空格,并且空白可以像逗号一样充当分隔符。

我尝试使用\s|,|(?<!^|,)(?=-),但这不起作用。我尝试使用它来分割293.46701,72.238185,但C#只是告诉我“输入字符串的格式不正确”。请注意,有一些SO无法正确显示的前导和尾随空格。

编辑:这是执行的代码,以及执行代码后的变量和值。 enter image description here

5 个答案:

答案 0 :(得分:5)

如果它不一定是Regex,如果它不必很慢:-)这应该为你做:

var components = "2.2 1.1-6.9,2.3-12.8 2.3".Replace("-", ",-").
Split(new[]{' ', ','},StringSplitOptions.RemoveEmptyEntries);

组件将包含:[2.2 1.1 -6.9 2.3 -12.8 2.3]

答案 1 :(得分:1)

是否需要拆分?你可以做Regex.Matches(text, @"\-?[\d]+(\.[\d]+)?")

如果您需要拆分,Regex.Split(text, @"[^\d.-]+|(?=-)")也可以使用。

P.S。我使用了Regex Hero来实时测试http://regexhero.net

答案 2 :(得分:1)

除非我完全忽略了这一点(这是星期天晚上,我累了;))我认为你需要更专注于匹配你 的事情想要而不是你不想要的东西。

Regex argsep = new Regex(@"\-?[0-9]+\.?[0-9]*");
string text_to_split = "-2.2 1.1-6.9,2.3-12.8 2.3 293.46701,72.238185";
var tmp3 = argsep.Matches(text_to_split);

这为您提供了所需的每个值的MatchCollection

要打破这种局面并尝试让你理解它的含义,将其分成几部分:

\-?匹配文字减号(\表示文字字符)零次或一次(?)
[0-9]+匹配0到9之间的任何字符,一次或多次(+)
\.?匹配一个文字句号,零或一次(?)
[0-9]*再次匹配0到9之间的任何字符,但这次是零次或多次(*)

你不需要担心这个正则表达式的\ s(空格)之类的东西,因为你实际想要匹配的东西是正数/负数。

答案 3 :(得分:0)

考虑使用字符串拆分功能。字符串操作比正则表达式更快,使用/理解起来更简单。

答案 4 :(得分:0)

如果“匹配”方法不起作用,你可能会分两步攻击某些东西?

Regex RE = new Regex(@"(-?[\d.]+)|,|\s+");
RE.Split(" -2.2,1.1-6.9,2.3-12.8,2.3 ")
       .Where(s=>!string.IsNullOrEmpty(s))

输出:

-2.2
1.1
-6.9
2.3
-12.8
2.3