2012-12-30 78 views
0

所以我有這樣的事情:正則表達式 - 匹配號碼範圍,周圍有沒有號碼

\ B(0 [1-9] | [1-2] [0-9] | 3 [ 0-6])\ b

對於只匹配數字1-36,它工作正常。但是我可能會得到像S36這樣的東西,它不會匹配。我不能在數字的任何一邊假設一個乾淨的單詞邊界。

我想擁有它,所以它會用除了兩邊其他任何數字匹配1-36。

我覺得像這樣的工作,但它並不:

(< = \ d?)(0 [1-9] | [1-2] [0-9]? |?3 [0-6])(= \ d)

這應該是一個積極的向後看的開始,以確保有是什麼,但數量和積極的前瞻後前位數字以確保它跟隨它一樣。

這樣做的正確方法是什麼?

+1

什麼正則表達式引擎?所有的口味都不支持向後看,甚至向前看。 – Lucero

+0

我在.NET中這樣做,但使用免費軟件Expresso進行測試。 – lintmouse

回答

1

如果您的引擎不支持回顧後/超前,那麼你仍然可以只匹配包括非數字的整個事情,並選擇您感興趣的捕獲。

(?:^|[^1-9])(0?[1-9]|[1-2][0-9]|3[0-6])(?:$|[^1-9]) 

你的結果會是在這個例子中的捕獲1中(「外部」匹配在非捕獲組中)。

注意使用.NET,你有回顧後先行和全面支持,使下面應該工作:

(?<![0-9])(?:0?[1-9]|[1-2][0-9]|3[0-6])(?![0-9]) 

本品採用消極而不是積極環視環視。否則,位於字符串開頭或末尾的數字將不匹配,因爲在沒有字符的情況下需要使用非數字字符,導致不匹配。

+0

好的,.NET的完美工作。謝謝! – lintmouse

+0

我只是做了一個小的編輯,將大括號加回去,否則在任何情況下都無法使用。對於那個很抱歉。 – Lucero

1

你可以使用[^ 0-9]在開始和結束,然後通過(第二次在這種情況下)看在適當的拍攝組獲得數:

(^|[^0-9])(0?[1-9]|[1-2][0-9]|3[0-6])($|[^0-9]) 
+0

感謝您的回覆。就兩邊不匹配的數字而言,這正是我想要的 - 但它也匹配非數字。所以,如果我把字符串S36,它匹配S36,而不是隻有36 ... – lintmouse

+1

@垃圾。 _「,然後通過查看合適的捕獲組(在本例中爲第二個)來獲得數字」_「。的Javascript?例如:''S36'.replace(/(^ | [^ 0-9])(0 [1-9] | [1-2] [0-9] | 3 [0-6])($ | [^ 0-9])/,'$ 2')'第二個捕獲的組是'$ 2',所以結果是'36'。 – MikeM

+0

好吧,我的壞。謝謝。 – lintmouse

相關問題