java - 如何升级此正则表达式而不捕获“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})?)
解决方案
您可以考虑匹配前面没有单词 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=><:]|$)
- 紧随其后,必须有空格、、、、=
或字符串结尾。>
<
:
推荐阅读
- hyperledger-fabric - Hyperledger Fabric 错误:mychannel 收到发现错误:访问被拒绝
- three.js - 到达极限时,Aframe 轨道控制相机平移和旋转动画
- c# - 什么是正确的 API 端点?
- tensorflow - 将 What if 工具与 xgboost 一起使用
- c# - 如何在 lambda 表达式中访问列表中的下一项
- python - python中Weibull分布的拟合优度检验
- reactjs - React - 测试元素是否设置了“禁用”
- c - 如何将数字打包成字节的特定位?
- string - 将驼峰式字符串转换为飞镖语言中的下划线
- react-native - 即使在头像元素中使用了圆形属性后,如何获得圆形头像