从一组匹配的匹配的第一个字符
问题描述:
我有日期格式字符串将含有Y,M和D.例如,某些格式可能是:从一组匹配的匹配的第一个字符
YY-MM-DD
M-D-Y G
MM/Y/DD
(etc)
我想上运行一个正则表达式匹配像这样的字符串并依次提取Y,M,D。例如,在上面的,我想有:
array('Y', 'M', 'D');
array('M', 'D', 'Y');
array('M', 'Y', 'D');
(etc)
我写了这个正则表达式expresion:
/(m+)|(d+)|(y+)/
但问题是,它返回整场比赛,而不是第一个字符像所以:
array('YY', 'MM', 'DD');
array('M', 'D', 'Y');
array('MM', 'Y', 'D');
(etc)
如何编写我的表达式,以便它只返回第一个字符?
编辑:一些代码(真的没什么复杂的)。
$dates = array('YY-MM-DD', 'M-D-Y G', 'MM/Y/DD');
foreach($dates as $date){
preg_match_all('/(m+)|(d+)|(y+)/', strtolower($date), $matches);
var_dump($matches);
}
答
在我看来就像/\b[ymd]/
是所有你需要:
$dates = array('YY-MM-DD', 'M-D-Y G', 'MM/Y/DD');
foreach($dates as $date){
preg_match_all('/\b[ymd]/', strtolower($date), $matches);
var_dump($matches);
}
编辑:这里有一个处理年月日以及:
/(?<!y)y|(?<!m)m|(?<!d)d/
输出:
array(1) {
[0]=>
array(3) {
[0]=>
string(1) "y"
[1]=>
string(1) "m"
[2]=>
string(1) "d"
}
}
array(1) {
[0]=>
array(3) {
[0]=>
string(1) "m"
[1]=>
string(1) "d"
[2]=>
string(1) "y"
}
}
array(1) {
[0]=>
array(3) {
[0]=>
string(1) "m"
[1]=>
string(1) "y"
[2]=>
string(1) "d"
}
}
答
我不擅长正则表达式。但下面的代码可以解决你的问题,直到你找到一个更好的正则表达式字符串。
$dates = array('YY-MM-DD', 'M-D-Y G', 'MM/Y/DD');
$result = array();
foreach($dates as $date){
preg_match_all('/([m])[mdy]?|([d])[mdy]?|([y])[mdy]?/i', $date, $matches);
$tmp = array();
for($i=1;$i<=3;$i++){
foreach($matches[$i] as $m){
if(!empty($m)){
$tmp[] = $m;
break;
}
}
}
$result[] = $tmp;
}
答
我觉得这个比较好:用正则表达式收集第一个字母。但是我认为在M,D,Y之间只能出现“ - ”,“/”和“\”字符。如果您需要,您可以添加更多。
$dates = array('YY-MM-DD', 'M-D-Y G', 'MM/Y/DD');
$result = array();
foreach($dates as $date){
preg_match_all('/([mdy])[a-z0-9\ \-\/\\\]?/i', $date, $matches);
$result[] = $matches[1];
}
+0
正则表达式似乎有一个错误,当我尝试在正则表达式的朋友。 – F21
这工作得很好,但是如果格式是YYYYMMDD,它不起作用。 – F21
好的,请参阅我的编辑。 –
完美!正是我需要的。谢谢你的帮助 :) – F21