我有一些具有以下模式的文本
~,以及可选的 a - 然后是一些数字
所以我可以有(可以成为一些更大文本的一部分)
~7
~-6
~-11534
~-0
例如,我的文本可以是:
New Zealand~1 expenditure~-900
现在我正在使用这种模式:
[~-]*[0-9]*[0-9]
它似乎可以完成工作,但我知道 [0-9]*[0-9] 是贪婪匹配(0 到无限次)
我想知道是否有更好的模式?
编辑:实际上,为了更好地满足您的要求,我建议
~-?[0-9]+
通过这种方式,我们指定~
必需的,并且可以后跟-
和数字。
量词后面的问号说尽可能少地取,使其不贪婪,但在当前示例中是不必要的。
编辑2:我最近注意到数字并不完全可选,并将"零或多个"量词*
更改为"一个或多个"量词+
。
编辑3:谈论"贪婪"和"不贪婪"。非贪婪算法将返回尽可能少的算法,如果字符串末尾有多个数字,它将只包含第一个数字到结果中,这不是您要查找的。
更多关于贪婪和非贪婪算法的信息,感谢Wiktor Stribiżew的出色解释:
模式末尾的惰性量词将匹配 0(如果使用 *?)或 1(如果使用 +?)字符。发生这种情况是因为延迟量化模式只抓取它们必须首先匹配的内容(最小出现次数)并被跳过,以便可以检查后续模式。只有当不匹配时,引擎才会返回到延迟量化的子模式,以将其再扩展一个字符并重试。