2014-11-24 98 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

相关问题