使用正则表达式从文本中解析数字

时间:2011-03-25 21:56:11

标签: regex text-parsing

我需要一个正则表达式(理想情况下是PHP兼容的),它找到所有以边界,等号(=)或冒号(:)开头的数字,但忽略百分比(数字后跟%符号),次,日期和ISO 8859-1符号实体编号(例如 )。

一直使用以下内容,但每次都不起作用:

/(^:|\b|=|^&)([0-9]*[0-9.]*[0-9]+)(^%:;)?

1 个答案:

答案 0 :(得分:1)

你的正则表达式严重受损:

  • 你似乎使用插入符号(^)作为“not” - 它只在字符类中有意义;其他地方意味着“开始输入”。
  • 你的小点应该被逃脱,否则它将匹配任何角色。
  • 以等号或冒号开头的数字总是从边界开始(因为=和:不是\ w和数字) - 所以只需要\ b。

我绝对建议阅读一个很好的正则表达式参考 - 很多年前,“man perlre”是我的来源,但我相信现在有更好的。

以下应该做你想要的,假设数字在边界上开始和结束,没有数千个分隔符并使用点作为小数分隔符,时间和日期是由“:”分隔的数字序列,“ - “或”/“,这些数字序列是时间和日期。如果这些假设不正确,应该很容易改进。

/\b(?<!&#|\d[:\/-])(\d+(?:\.\d+)?)(?!%|[:\/-]\d)\b/

说明:

  • (?&lt;!...)负面观察,不包括您不希望看到的所有内容。
  • (\ d +(?:。\ d +)?)带整数和小数部分的数字,只捕获一个组
  • (?!...)负面预测,不包括您想要查看的所有内容。

注意我还假设您没有前面带有“&amp;#”的数字,但后面没有“;”。如果这个假设不成立则编码你的正则表达式是一个更难的问题。

测试:

$ pcretest
PCRE version 7.8 2008-09-05

  re> /\b(?<!&#|\d[:\/-])(\d+(?:\.\d+)?)(?!%|[:\/-]\d)\b/g
data> a12
No match
data> a 12
 0: 12
 1: 12
data> 12-12
No match
data> 12:12
No match
data> 12 23
 0: 12
 1: 12
 0: 23
 1: 23
data> &#12
No match
data> :12
 0: 12
 1: 12
data> =12
 0: 12
 1: 12
data> 12/12
No match
data> 12%
No match
相关问题