首页 > 解决方案 > 如何升级此正则表达式而不捕获“1hey”或“123_456_bye”或“1123_hey”

问题描述

我是正则表达式来提取满足以下示例的数字,粗体是需要捕获的内容:

0 : 0 he9lo 12.33你好00 3a> 4 hello7 5 <= 6 8hello -45,6 10help 123_456_bye 1 =a2 1123_hey

目标/条件是“提取”不包含任何字符但可以包含类似符号的数字序列。or , or : 捕捉小数(, or .)或时间(:)。

尝试在许多地方添加 [^a-zA-Z] 因为我的主要问题是避免使用数字+单词捕获序列。我还尝试在没有太多结果的情况下使用负前瞻(需要更多练习。)在 regex101中工作以试验正则表达式,因为我发现使用它们提供的工具和参考要容易得多。

这是我目前使用的正则表达式,它仍在捕获(“错误地”)以下示例:10help 123_456_bye 1123_hey

(?:^|<|>|=|<=|>=|\:|\s)([-]?[0-9]{1,}((\.|,)[0-9]{0,2})?)

标签: javaregex

解决方案


您可以考虑匹配前面没有单词 char 且后面没有单词 char 的数字。

-问题是由于可选的, ,您不能在模式的开头使用单词边界-?\b-?如果连字符出现在数字之前的字符串中并且如果它前面有一个非单词字符,则该模式将失败匹配。

您还需要允许在一些特殊字符、、 、=>空格之前和之后进行匹配<:

您可以使用

(?<!\w)(?<=[\s=><:]|^)-?[0-9]+(?:[.,][0-9]{1,2})?(?!\w)(?=[\s=><:]|$)

请参阅正则表达式演示

细节

  • (?<!\w)- 不允许紧接在前面的单词 char
  • (?<=[\s=><:]|^)- 紧接在前面,必须有空格、、、、=或字符串开头><:
  • -?- 一个可选的连字符
  • [0-9]+- 1+ 位数
  • (?:[.,][0-9]{1,2})? - 可选的.or序列,,然后是 1 或 2 位数字
  • (?!\w)- 不允许紧跟其后的单词 char
  • (?=[\s=><:]|$)- 紧随其后,必须有空格、、、、=或字符串结尾。><:

推荐阅读