2012-07-16 48 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