我差不多一个月前就问过这个问题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.2
,1.1
,-6.9
,2.3
,-12.8
和2.3
。
上述问题的不同之处在于现在可以存在前导和/或尾随空格,并且空白可以像逗号一样充当分隔符。
我尝试使用\s|,|(?<!^|,)(?=-)
,但这不起作用。我尝试使用它来分割293.46701,72.238185
,但C#只是告诉我“输入字符串的格式不正确”。请注意,有一些SO无法正确显示的前导和尾随空格。
编辑:这是执行的代码,以及执行代码后的变量和值。
答案 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