2012-07-16 43 views
1

我有一个格式化像这样的文本块:正则表达式:部分名称的长度未知?

1.2.3.4.51.2222.3.4.511.2

的不明数量的数字和点(法律文件的部分)

的我怎样才能将整个部分(1.2.3.4.5)捕获到一个组中?

我使用C#,但任何正则表达式都很好,我可以翻译它。

+0

@downvoter(S):栈溢出礼仪会对您发表评论说:为什么你连同你的反对票一起投票呢? – Bob2Chiv 2012-07-16 18:34:01

+0

@ Bob2Chiv我做到了。我应该为每一个相同的,但错误的答案写下评论吗? – 2012-07-16 18:36:36

+0

有人会在这里发表致意。 – GrayFox374 2012-07-16 18:38:59

回答

3

修订

使用此Regex

Regex.Matches(inputString, @"\d[\.\d]*(?<!\.)"); 

解释:

\d      digits (0-9) 

[.\d]*     any character of: '.', digits (0-9) 
         (0 or more times, matching the most amount possible)) 

(?<! subexpression)  Zero-width negative lookbehind assertion. 
+0

你错过了一个'('。 - > @“([\ d。] +)”当我尝试它的时候工作 – GrayFox374 2012-07-16 18:38:05

+0

@ GrayFox374:一个新的正则表达式!坦克的注意力 – Ria 2012-07-16 19:15:42

0

好,如果你知道你不能超越5,那么你可以做

@"1+((.2+)((.3+)((.4+)(.5+)?)?)?)?" 

,您可以扩大该模式的每一个符号,由有限数量的符号

+指任何数量的符号出现的,但至少1.如果0是有效的,你可以使用*代替

?:开口parenthesies后,如果您想要模式被捕获0​​像例子:(?:abc)
我省略了它们使正则表达式更具可读性。

的?在括号之后,表示前面的符号的1或0。

现在,如果你不知道你的字符串能走多远,例如

"1.2.3.4......252525.262626.272727.......n.n.n"比我的直觉告诉我,你不能做到这一点与正则表达式。

+0

我意识到我的错误,并编辑我的帖子是正确的 – 2012-07-16 18:28:23

+0

接受的答案表明您对订购做出了错误的假设。 – 2012-07-16 19:44:23

+0

@LB我没有upvote所有的答案,我的投票没有被锁定 – 2012-07-16 19:46:56

3
string s = "1.2.3.4.5 or 1.2222.3.4.5 or 1 or 1.2 or 2222.3333.111.5 etc"; 
var matches = Regex.Matches(s, @"\d+(\.\d+)*").Cast<Match>() 
    .Select(m => m.Value) 
    .ToArray(); 
+0

2222.3333.111.5 – 2012-07-16 18:32:04

+0

@SamIam它捕获了'2222.3333.111.5' – 2012-07-16 18:32:37

+0

它看起来好像它不应该也是'28359.205.295829.72827 – 2012-07-16 18:35:32