我如何升级此正则表达式无法捕获“ 1hey”或“ 123_456_bye”或“ 1123_hey”

时间:2019-08-27 09:01:12

标签: java regex

我是正则表达式,提取符合以下示例的数字,用粗体显示需要捕获的内容:

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

目标/条件是“提取”不包含任何字符但可以包含like等符号的数字序列。或或:捕获小数点(或。)或时间(:)。

试图在许多地方添加[^ a-zA-Z],因为我的主要问题是避免捕获带有数字和单词的后缀。 我还尝试使用negative lookahead,但没有很多结果(需要更多练习。) 在in regex101中进行正则表达式的实验,因为我发现它们提供的工具和参考要容易得多。

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

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

1 个答案:

答案 0 :(得分:2)

当数字前面没有单词char且后面没有字符char时,您可以考虑匹配数字。

问题在于,由于可选的--?,您无法在模式的开头使用单词边界。如果在数字前的字符串中存在连字符,并且如果在字符前加了非单词char,则\b-?模式将使匹配失败。

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

您可以使用

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

请参见regex demo

详细信息

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