2010-05-17 61 views
1

我有以下的正則表達式:(?<=\.\d+?)0+(?=\D|$)我跑這對包含以下字符串:SVC~NU^0270~313.3~329.18~~10~~6.00:正則表達式問題:爲什麼不匹配?

當它運行時,它匹配的6.00(正確),這我的邏輯,然後修剪一個零變成6.0 。正則表達式然後再次運行(或應該),但沒有拿起6.0。

我決不是一個正則表達式的專家,但我對我的表達的理解是,它正在尋找一個或多個可選(所以,真正爲零或更多)數字的小數點之前的一個或多個零是然後是任何非數字字符或換行符。假設解釋是正確的,我不明白爲什麼它不會匹配第二遍。對於這個問題,我不知道爲什麼我的Regex.Replace不匹配第一遍的完整6.00並刪除兩個尾隨零...

有什麼建議嗎?

+0

這正則表達式是尋找最後的零,如果它發現它,它就會刪除它(因此比賽) - 如果沒有第二個「0」無法找到匹配,因此失敗... [仔細看看你]找到補救辦法 - 你需要什麼來恢復? – Glycerine 2010-05-17 18:31:46

+0

第二個想法,@Glycerine是對的:目前還不清楚你期望的最終結果。我的答案會「修復」表達式,但結果會很奇怪(至少對我來說),因爲它會去掉所有尾隨的零,只留下'6.'。 – 2010-05-17 18:40:39

+0

最終,如果在它後面沒有數字,我確實希望小數點被刪除,但是我相對有信心能夠做到這一點 - 我無法弄清楚爲什麼單個0不匹配。謝謝。 – AllenG 2010-05-17 18:45:19

回答

2

+?表示「匹配一個或多個,非貪婪」。你大概認爲它意味着與*相同,即匹配零次或多次。所以前面的表達式\d必須匹配至少一次,以便您的整個表達式匹配,而輸入6.0不再是這種情況。

更改+?*並且該表達式應該起作用。

+0

我剛剛試過,那會去掉任何零的句號......因此'SVC〜NU^0270〜313.3〜329.18〜10〜6.00000000000:'會變成'SVC〜NU^0270〜313.3〜329.18 ~~ 10 ~~ 6.:' – Glycerine 2010-05-17 18:35:42

+0

@Glycerine:是的,這會改變正則表達式的含義。這不是OP想要的嗎?畢竟,他明確地*想*找到'6.0'並去掉尾隨的零。 – 2010-05-17 18:39:31

+0

這意味着只有在小數點後至少有兩位數字,並且最後一位或一位數字爲零時,您的正則表達式纔會匹配。它不會在小數點後直接匹配零。 我想你只需要用'\ d *'替換'\ d +?'# – Bounderby 2010-05-17 18:40:01

0

試試這個:

(?<=\.\d+?)0*?(?=\D|$) 
+0

注意,這可能會導致大小爲零的匹配(如果.NET中有這樣的事情......)。 – 2010-05-17 18:46:08

+0

此更改僅允許它在序列*不以*結尾時匹配空字符串 - 而且是@Konrad,這是完全合法的。但在這種情況下,這是毫無意義的,因爲意圖是去除尾隨的零。 – 2010-05-18 01:38:51

相關問題