2014-11-24 96 views
0

有很多與數字匹配的表達式,比如\d,1[0-9][0-9],\d{4},, 但是如何檢查表達式是否只匹配數字?如何檢查正則表達式是否僅匹配數字?

例如,\d匹配0到9,所以表達式爲true爲「僅匹配數字」。

另一個例子,1[0-9a-z]匹配數字10,但也匹配1不是數字。所以爲「僅匹配號碼」。

here所述,很難描述「數字」是什麼,所以我想限制它只是一個整數。

我的問題並不意味着我想要一個匹配整數的表達式,而是一種反向正則表達式來檢查表達式本身。感謝閱讀! :)

+3

您是否試圖以編程方式確定使用一個正則表達式是否另一個正則表達式可以匹配任何不僅是整數的字符串?除了只有'\ d'或'[0-9]'和乘數的微小情況外,這是非常困難的*。 – jonrsharpe 2014-11-24 10:11:23

+0

http://stackoverflow.com/questions/8586346/python-regex-for-integer – theMarceloR 2014-11-24 10:11:42

+1

我不知道你在說什麼?你在說整數和小數嗎? – RvdK 2014-11-24 10:13:42

回答

3

如果我理解正確的問題,要檢查 - 給予一定的正則表達式[R - 如果[R可能匹配任何這不是一個數字。從這個意義上說,空的正則表達式$^(不匹配)將通過測試,因爲它不匹配(因此沒有非數字)。然而,1[0-9][0-9a-z]匹配10s,這不是一個數字,因此測試失敗。

這對於Python的正則表達式來說是不可能的。您需要一個支持交集(&),補碼(〜)和非空虛測試(例如,通過匹配單詞)的正則表達式語言。然後,如果[R是你的正則表達式,你需要檢查是否

`r & ~(0|[1-9][0-9]*)` 

非空。

交叉點和補碼在計算上很昂貴,但有一些正則表達式庫支持它們。我知道的一個例子(Java)是BRICS automaton/regex library

這可以實現如下(假設你秉承金磚國家正則表達式語法):

// Checks if `re` might match a non-number, and returns an example; otherwise, null is returned 
public String matchesNonNumber(String re) { 
    // construct regex like above 
    RegExp bricsRe = new RegExp("(" + re + ") & ~(0|[1-9][0-9]*)", RegExp.INTERSECTION | RegExp.COMPLEMENT); 
    Automaton a = bricsRe.toAutomaton(); 
    return a.getShortestExample(true); // returns shortest accepted string, or null if no string is accepted 
} 

RegExpAutomaton類的Javadoc。這不是與問題的python標籤匹配的示例,但是您要解決的問題也不是固有的語言特定的。

+0

你不經常發現自己希望問題能夠達到答案的質量(而不是其他方式)。謝謝! – xbug 2014-11-24 10:38:39

+0

謝謝,這就是我想知道的:) – HayatoY 2014-11-24 11:50:27