RegEx返回所有比赛

时间:2014-11-30 14:22:28

标签: php regex

我有这个字符串:

Sales History Book/Page Sale Date Deed Type Sale Condition Sale Price 24604 - 001199/2/2014TD -     TAX DEED9 - PUBLIC UTILITY OR GOVERNMENT$10,000.0017178 - 004422/28/2005QC - QUIT CLAIM DEED2 - PARTIAL INTEREST$0.0010482 - 0076612/17/1998WD - WARRANTY DEED0 - VALID SALE FMV$68,800.0005088 - 0033910/19/1984WD - WARRANTY DEED0 - VALID SALE FMV$48,425.00          Sales which occurred prior to January 1 of this year were used to establish values for the current year.

我希望推出每个销售,可以看作格式化为DDDDD - DDDDD [一堆字符,然后.DD

我试过了:

$regEx = "/\d{5} - \d{5}.+.\d{2}/";
preg_match($regEx,$salesString,$match);
print_r($match);

但它会返回从24604到销售一词之前的最终.00的所有内容。理想情况下,我的正则表达式将返回四个单独的行,因此我可以更精细地解析每一行。

你会推荐什么改变?提前谢谢!

1 个答案:

答案 0 :(得分:1)

3次更改

  • .+非贪婪地视为.+?

    要求.+贪婪并尝试匹配尽可能多的字符。所以它从开始24604开始匹配,并贪婪地继续比赛,直到最后一场比赛.00

  • .转换为\.

    正则表达式中的

    .匹配任何字符。为了匹配.,我们应该逃避特殊含义,以便它与.

  • 相匹配
  • 使用match_all

    执行全局正则表达式匹配并检索与正则表达式匹配的字符串的所有部分。 match仅检索第一场比赛的位置

正则表达式可以是

\d{5} - \d{5}.+?\.\d{2}

示例: http://regex101.com/r/zX8cZ0/1

使用示例

$re = "/\\d{5} - \\d{5}.+?\\.\\d{2}/";
preg_match_all($re, $str, $matches);
print_r($matches);

将输出

Array ( [0] => Array ( 
              [0] => 24604 - 001199/2/2014TD - TAX DEED9 - PUBLIC UTILITY OR GOVERNMENT$10,000.00 
              [1] => 17178 - 004422/28/2005QC - QUIT CLAIM DEED2 - PARTIAL INTEREST$0.00 
              [2] => 10482 - 0076612/17/1998WD - WARRANTY DEED0 - VALID SALE FMV$68,800.00     
              [3] => 05088 - 0033910/19/1984WD - WARRANTY DEED0 - VALID SALE FMV$48,425.00 ) 
      )