php正则表达式解析数据

时间:2016-02-04 09:29:54

标签: php regex

我有一个字段,其中包含20个字符(带右边空格字符的填充字符串),如下所示:

  

VINEYARD HAVEN MA
  BOLIVAR TN
  ,
  BOLIVAR,TN
  北托万川,纽约

如何使用正则表达式来解析和获取数据,我想要的结果将如下所示:

  

[1] VINEYARD HAVEN [2] MA

     

[1] BOLIVAR [2] TN

     

[1],或清空[2],或空

     

[1] BOLIVAR,或BOLIVAR [2] TN或TN

     

[1] NORTH TONAWANDA,或NORTH TONAWANDA [2] NY或NY

目前我使用此正则表达式:

^(\D*)(?=[ ]\w{2}[ ]*)([ ]\w{2}[ ]*)

但它不符合这条线:

  

请帮助调整我的正则表达式,以便匹配上面的所有数据

2 个答案:

答案 0 :(得分:1)

这个正则表达式怎么样:^(.*)[ ,](\w*)$?您可以在此处查看:http://regexr.com/3cno7

使用示例:

<?php

$string = 'VINEYARD HAVEN MA
BOLIVAR TN
,
BOLIVAR, TN
NORTH TONAWANDA, NY';

$lines = array_map('trim', explode("\n", $string));

$pattern = '/^(.*)[ ,](\w*)$/';

foreach ($lines as $line) {
    $res = preg_match($pattern, $line, $matched);

    print 'first: "' . $matched[1] . '", second: "' . $matched[2] . '"' . PHP_EOL;
}

答案 1 :(得分:0)

可能可以在正则表达式(try /(.*)\b([A-Z][A-Z])$/)中实现它,但是如果你不知道如何编写正则表达式never be able to debug it。是的,它值得发现是一个学习练习,但是因为我们在这里谈论PHP(它确实有一个存储已编译RE的机制,并且通常不用于批量数据操作)我会使用类似下面的内容,如果我需要快速解决问题并在可维护的代码中解决:

$str=trim($str);
if (preg_match("/\b[A-Z][A-Z]$/i", $str, $match)) {
    $state=$match[0];
    $town=trim(substr($str,0,-2)), " ,\t\n\r\0\x0B");
}