2015-03-13 80 views
-2

一個值大於2000,我需要一個正則表達式是真對投入2000以上:匹配使用正則表達式

for (int i = 1998; i < 10001; i++) 
{ 
    String s = Integer.toString(i); 

    // Above Range 2000 to 9999 

    System.out.print(i+"\t"); 

    System.out.println(s.matches("[^1]?[0-9]{1,3}")); 
} 
+3

爲什麼你不直接測試整數? – 2015-03-13 13:53:00

+1

你需要一個if語句,而不是一個正則表達式。 – 2015-03-13 13:53:16

+0

其實我需要將它從一組24位字符行中拆分 – user3632150 2015-03-13 13:55:54

回答

0

你或許應該只使用整數比較,而只是爲了好玩,這裏的正則表達式:

/(\d{5,}|[2-9](?=\d*[1-9])\d{3})/g 

看到它在行動here

+0

這個工作原理* *幾乎*所有的情況下,只要你不是用'0'引導你的數字 - 也就是匹配00003. – 2015-03-14 21:16:38

0

如果你想從字符串中提取僅整數大於2000,兩種方式都是可能的。

由於正則表達式模式是在字符邏輯中構建的,因此在正則表達式模式中考慮數學考慮總是很簡單的。因此,您可以簡單地使用[0-9]+[1-9][0-9]*提取所有整數,將結果轉換爲整數並使用if語句測試每個整數。

您可以直接使用該模式,但您需要謹慎地限制對性能的影響,避免巨大的替換和失敗的分支。這是可以做到這一點的方式:

[3-9][0-9]{3,} 
| 
2   
(?: 
    [1-9][0-9]{2,} 
    | 
    0 
    (?: 
     [1-9][0-9]+ 
     | 
     0 (?: [1-9][0-9]* | 0 [0-9]+) 
    ) 
) 
| 
1 [0-9]{4,} 

注:允許2000,刪除所有的第二個主要的替代和先更改爲[2-9][0-9]{3,}

這種模式的主要興趣是,一旦正則表達式引擎進入分支時,它總是處於良好狀態,並且沒有其他分支來測試結果(成功或失敗)。請注意,三個主要分支按概率順序排序,再一次限制發動機工作。

如果您將所有文件都包含在非捕獲組中,並且如果當前測試的字符是數字,則使用向前檢查來更好地進行改進(必須進行測試)。這種改進允許快速跳過不是數字的字符串的所有字符而無需測試主交替的三個分支。

(?=[1-9])(?:pattern) 

給出:

(?=[1-9])(?:[3-9][0-9]{3,}|2(?:[1-9][0-9]{2,}|0(?:[1-9][0-9]+|0(?:[1-9][0-9]*|0[0-9]+)))|1[0-9]{4,}) 
+0

@DevonParsons :的確,現在它已經得到糾正。該模式的設計並不簡短,它的設計非常有效。 – 2015-03-14 22:33:39