RegExp:如何从模式搜索中包含 'avoid non-numeric characters'?

RegExp: How do I include 'avoid non-numeric characters' from a pattern search?

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

如何将非数字否定值包含到正则表达式模式中?同样,

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

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

如果没有进一步了解您要实现的目标,很难建议如何为其构建正则表达式,但根据您的示例,(我认为)这应该可行:.+\d+\D+

我想你正在寻找

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

这里是a demo

记得在 Swift:

中正确转义正则表达式
let rx = "^\d*(?:\.\d+)?(?:(?<=\d)[^.\d\n]+\.)?$"

正则表达式解释:

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

我正在使用非捕获组 (?:...) 以获得更好的性能和可用性。

更新:

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

\.[0-9]+\.

在Swift、let rx = "\.[0-9]+\."。它匹配以点开头的任何子字符串,然后是 0 到 9 范围内的 1 个或多个数字,然后再是一个点。

another regex demo