举个例子:AAA@XXX YYYY匹配到@和空格之间的字符XXX,请问正则怎么来写?
AAA@XXX YYYY
XXX
认证高级PHP讲师
preg_match('/@(.*) /', 'AAA@XXX YYYY', $result);
if(preg_match_all( '%@(\w+)%u', '@张全蛋 含泪质检@三星Note7 被炸飞,听说@炸机 跟@啤酒 更配哦!', $arr )) { var_export($arr); } //输出 array ( 0 => array ( 0 => '@张全蛋', 1 => '@三星Note7', 2 => '@炸机', 3 => '@啤酒', ), 1 => array ( 0 => '张全蛋', 1 => '三星Note7', 2 => '炸机', 3 => '啤酒', ), )
正则表达式 %@(\w+)%u 中:%是分隔符.u是修饰符,表示unicode.\w是元字符,在ASCII下等价于[A-Za-z0-9_],在unicode下表示字符(包括中文)和数字和下划线.+是量词,表示1个或多个,等价于{1,}的写法.()表示子模式,体现在匹配结果中的$arr[1]里.区别于主模式,体现在匹配结果中的$arr[0]里.
%@(\w+)%u
%
u
\w
[A-Za-z0-9_]
+
{1,}
()
另外,也可以试试下面这个正则表达式:
%@(\S+)\s% 其中: \s 匹配空白字符,包括:空格,制表符(\t,\v),回车(\r),换行(\n),换页(\f),等价于[ \t\r\n\v\f] \S 匹配除空白字符外的任意字符,等价于[^ \t\r\n\v\f]
另外:
preg_match: 返回模式的匹配次数,0次(不匹配)或1次,因为preg_match在第1次匹配后会停止搜索. preg_match_all: 返回完整匹配次数,如果发生错误返回FALSE.
也就是说,如果上面的例子使用preg_match,那只能匹配到字符串中的"张全蛋".
preg_match
@(.+)\s
var ex = "aaa@abc yyy";var pattern = /@(.+?)s/g;var rs = ex.match(pattern)[0].slice(1,4);
应该是这样:'AAA@XXX YYYY'.match(/@(.*)\s/)[1]如果要防止XXX中包含@和空格,就要这样:'AAA@XXX YYYY'.match(/@([^@\s]*)\s/)[1]
'AAA@XXX YYYY'.match(/@(.*)\s/)[1]
@
'AAA@XXX YYYY'.match(/@([^@\s]*)\s/)[1]
var ex = "aaa@abc yyy"; var pattern = /@(.+?)\s/g; pattern.exec(ex)[1]
// abc
正则表达式
%@(\w+)%u
中:%
是分隔符.u
是修饰符,表示unicode.\w
是元字符,在ASCII下等价于[A-Za-z0-9_]
,在unicode下表示字符(包括中文)和数字和下划线.+
是量词,表示1个或多个,等价于{1,}
的写法.()
表示子模式,体现在匹配结果中的$arr[1]里.区别于主模式,体现在匹配结果中的$arr[0]里.
另外,也可以试试下面这个正则表达式:
另外:
也就是说,如果上面的例子使用
preg_match
,那只能匹配到字符串中的"张全蛋".@(.+)\s
var ex = "aaa@abc yyy";
var pattern = /@(.+?)s/g;
var rs = ex.match(pattern)[0].slice(1,4);
应该是这样:
'AAA@XXX YYYY'.match(/@(.*)\s/)[1]
如果要防止
XXX
中包含@
和空格,就要这样:'AAA@XXX YYYY'.match(/@([^@\s]*)\s/)[1]
// abc