正则表达式匹配匹配条件的结尾

时间:2016-04-14 06:50:54

标签: regex preg-match

我希望从正则表达式中的条件或条件的结尾进行匹配。

$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>.*))/';

我想匹配取消下午5点 - RQST-NO FEATHER 仅当字符串从 SI -

开始时

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:1)

您的(?(?=SI)(?<matchfromend>[A-Z]+$)正则表达式部分不会使用从字符串开头到结尾(?<matchfromend>[A-Z]+$模式的任意字符。

您可以使用以下正则表达式:

'~^(?(?=SI).*#¤(?<matchfromend>.+$)$|(?<else>.*))~'

请参阅regex demo

解释

  • ^ - 字符串开头
  • (?(?=SI).*#¤(?<matchfromend>.+$)$|(?<else>.*)) - 有条件的:
    • 如果SI出现在开头((?=SI)),则匹配除了换行符之前的0 +字符,直到最后,并且除了换行符之外还会捕获1 +以外的字符字符串的结尾为Group&#34; matchfromend&#34;
    • 如果开头没有SI,请将换行符以外的0 +字符匹配到该行的末尾。

另一种非REGEX方法

检查字符串是否以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;