我有一个字段,其中包含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}[ ]*)
但它不符合这条线:
,
请帮助调整我的正则表达式,以便匹配上面的所有数据
答案 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");
}