我正在尝试编写一个正则表达式来检测包含数字范围的句子,例如:“我每天吃2-6个披萨”“我的体重在50.22-220.5公斤之间。”但不是带更多连字符的数字:“我的电话号码是1-23-4567”或:“我用WD-40穿裤子。”到目前为止,我已经提出了:
\b\d+-\d+\b
但它仍然可以检测到123-2312-12之类的东西。
tkclm6bt1#
如果支持lookarounds,您可以将模式编写为:
(?<!\S)\d+(?:\.\d+)?-\d+(?:\.\d+)?(?!\S)
(?<!\S)
\d+(?:\.\d+)?
-
(?!\S)
参见regex demo。
m4pnthwp2#
恐怕你的问题太宽泛了,静态正则表达式不一定能处理,但我会尝试给予你一个如何使用正则表达式实现范围的基本方法。例如,下面的模式:
[2-6][1-8]
匹配21和68之间的任意数字。你可以使用类似这样的东西,试着实现你想要的东西,但是就像我说的,用一个静态正则表达式来处理所有的范围是很困难的,你可以试着用here。
21
68
wgx48brx3#
此解决方案排除了所有不允许的序列:(?!(()|()))排除具有OR |条件的模式(\d+-\d+-)排除包含1-23-形式的数字的句子([A-Z]-\d+)不包括后面跟有连字符和数字的所有大写字母,如D-4。
(?!(()|()))
|
(\d+-\d+-)
([A-Z]-\d+)
^((?!(\d+-+\d+-)|[A-Z]-\d+).)+$
3条答案
按热度按时间tkclm6bt1#
如果支持lookarounds,您可以将模式编写为:
(?<!\S)
左侧的空白边界\d+(?:\.\d+)?
匹配1+位数和可选小数部分-
按字面匹配\d+(?:\.\d+)?
将1+位数与可选小数部分匹配(?!\S)
右侧的空白边界参见regex demo。
m4pnthwp2#
恐怕你的问题太宽泛了,静态正则表达式不一定能处理,但我会尝试给予你一个如何使用正则表达式实现范围的基本方法。例如,下面的模式:
匹配
21
和68
之间的任意数字。你可以使用类似这样的东西,试着实现你想要的东西,但是就像我说的,用一个静态正则表达式来处理所有的范围是很困难的,你可以试着用here。
wgx48brx3#
此解决方案排除了所有不允许的序列:
(?!(()|()))
排除具有OR|
条件的模式(\d+-\d+-)
排除包含1-23-形式的数字的句子([A-Z]-\d+)
不包括后面跟有连字符和数字的所有大写字母,如D-4。