我想从 正则表达式 中的 or 条件的结果末尾开始匹配。
$a = 'SI-#CL#¤1801 BARBER LANE#CL#MILPITAS CA 95035#CL#FONE 1-408-943-0600#CL#FAX 1-408-943-0484#CL#¤CANCEL BY 5 PM - RQST-NO FEATHER';
$pat = '/^(?(?=SI)(?<matchfromend>[A-Z]+$)|(?<else>.*))/';
我想匹配 CANCEL BY 5 PM - RQST-NO FEATHER 仅当字符串从 SI- 开始时
有什么建议吗??
谢谢
最佳答案
你的 (?(?=SI)(?<matchfromend>[A-Z]+$)
正则表达式部分不消耗从字符串开头到结尾的任意字符 (?<matchfromend>[A-Z]+$
模式。
您可以使用以下正则表达式:
'~^(?(?=SI).*#¤(?<matchfromend>.+$)$|(?<else>.*))~'
参见 regex demo
解释:
-
^
- 字符串开始 -
(?(?=SI).*#¤(?<matchfromend>.+$)$|(?<else>.*))
- 有条件的:- 如果
SI
出现在开头 ((?=SI)
) 匹配除换行符以外的 0+ 个字符,直到最后一个#¤
, 并将字符串末尾除换行符以外的 1+ 个字符捕获到组“matchfromend” - 如果没有
SI
在开头,匹配除换行符以外的 0+ 个字符,直到行尾。
- 如果
另一种非正则表达式方法
检查字符串是否以SI
开头如果是,用 #¤
展开并获得最后一项。如果不是,则使用整个字符串。
参见 IDEONE demo :
$str = "SI-#CL#¤1801 BARBER LANE#CL#MILPITAS CA 95035#CL#FONE 1-408-943-0600#CL#FAX 1-408-943-0484#CL#¤CANCEL BY 5 PM - RQST-NO FEATHER"; // => CANCEL BY 5 PM - RQST-NO FEATHER
//$str = "#CL#¤1801 BARBER LANE#CL#MILPITAS CA 95035#CL#FONE 1-408-943-0600#CL#FAX 1-408-943-0484#CL#¤CANCEL BY 5 PM - RQST-NO FEATHER";
$res = $str;
if (strrpos($str, "SI", -strlen($str)) !== false) { // starts with SI
$arr = explode("#¤", $str);
if (!empty($arr)){
$res = array_pop($arr);
}
}
echo $res;
关于regex - 从匹配条件结束开始匹配的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36615740/