RegExp:如何在模式搜索中包含“避免非数字字符”?

时间:2015-06-29 21:51:45

标签: regex regex-negation

我想过滤掉所有.+[0-9].(正确方法?)模式,以避免数字中重复的小数点:(例如.12345.);但允许非数字包含重复的小数点:(例如 .12345*.)其中*NON-NUMERAL

如何在正则表达式模式中包含非数字否定值?再次,

.12345. <-- error: erroneous numeral.<br/>
.12345(.' or '.12345*.' <-- Good.

2 个答案:

答案 0 :(得分:2)

我认为你在寻找

^\d*(?:\.\d+)?(?:(?<=\d)[^.\d\n]+\.)?$

这是a demo

请记住在Swift中正确地逃避正则表达式:

let rx = "^\d*(?:\\.\\d+)?(?:(?<=\\d)[^.\\d\\n]+\\.)?$"

REGEX EXPLANATION

  • ^ - 字符串开头
  • \d* - 可选择匹配数字
  • (?:\.\d+)? - 匹配小数部分,0或1次(由于?
  • (?:(?<=\d)[^.\d\n]+\.)? - 可选(由于末尾为?)匹配一个或多个前面带有数字的符号(由于(?<=\d) lookbehind)而不是数字({{1} }),句号([^\d])或换行符([^.])(这个更多用于演示目的),然后是句号([^\n])。
  • \. - 字符串结尾

我正在使用非捕获组$以获得更好的性能和可用性。

<强>更新

如果您更喜欢相反的方法,即匹配无效字符串,您可以使用更简单的正则表达式:

(?:...)

在Swift中,\.[0-9]+\. 。它匹配任何以点开头的子串,然后是0到9范围内的1位或更多位,然后再点一个点。

请参阅another regex demo

答案 1 :(得分:1)

非数字正则表达式分隔的字符是\D。相反,如果您只查找数字,\d会起作用。

如果没有进一步了解你想要实现的内容,很难建议如何为它构建一个正则表达式,虽然基于你的例子,(我认为)这应该有效:.+\d+\D+