【问题标题】:How to check if regex matches only number?如何检查正则表达式是否仅匹配数字?
【发布时间】:2015-01-22 00:16:46
【问题描述】:

有很多表达式可以匹配数字,例如\d1[0-9][0-9]\d{4}、... 但是如何检查表达式是否只匹配数字?

例如,\d 匹配 0 到 9,因此表达式为 true 作为“仅匹配数字”。

另一个例子,1[0-9a-z] 匹配像 10 这样的数字,但也匹配不是数字的 1。所以 false 作为“只匹配数字”。

正如here 所提到的,很难描述“数字”是什么,所以我想将它限制为一个整数。

我的问题并不意味着我想要一个匹配整数的表达式,而是一种反向正则表达式来检查表达式本身。感谢阅读! :)

【问题讨论】:

  • 您是否尝试以编程方式确定使用一个正则表达式是否另一个正则表达式可以匹配任何不只是整数的字符串?除了只有\d[0-9] 和乘数的琐碎情况外,这非常困难
  • 我不知道你在说什么?你说的是整数和小数吗?
  • 您可以根据您所知道的验证正则表达式的内容创建一个新的正则表达式,或者通过抛出一些虚拟数据和 if-else 来测试该正则表达式以捕获结果...
  • @jonrsharpe 是的,没错,如果可能的话,没有必要使用一个正则表达式来实现。

标签: python regex


【解决方案1】:

如果我正确理解了这个问题,你想检查一下 - 给定一些正则表达式 r - 如果 r 可能匹配任何不是数字的东西。从这个意义上说,空的正则表达式$^(不匹配)将通过测试,因为它不匹配(因此不匹配非数字)。但是,1[0-9][0-9a-z]10s 匹配,后者不是数字,因此测试失败。

这在 Python 的正则表达式工具中是不可能的。您需要一种支持交集 (&)、补码 (~) 和非空性测试的正则表达式语言(例如,通过匹配词的生成)。然后,如果 r 是您的正则表达式,您需要检查是否

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

非空。

交集和补集的计算成本很高,但有一些正则表达式库支持它们。我知道的一个例子(Java)是BRICS automaton/regex library

这可以实现如下(假设您遵守 BRICS 正则表达式语法):

// 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 标记的示例,但您要解决的问题本身也不是特定于语言的。

【讨论】:

  • 您并不经常发现自己希望问题取决于答案的质量(而不是相反)。谢谢!
  • 谢谢,这就是我想知道的:)
猜你喜欢
  • 2019-04-20
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2011-10-25
  • 2022-01-18
相关资源
最近更新 更多