regex - 从匹配条件结束开始匹配的正则表达式

标签 regex preg-match

我想从 正则表达式 中的 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/

相关文章:

php - 使用 php mysql 在巨型多维数组中搜索

c# - 匹配未由 & 和 ; 包围的文本

ruby-on-rails - 在 bash 中匹配带有空白字符的字符串

javascript - 使用 JavaScript 更改字符串

javascript - 更正移动正则表达式模式

php - xml 输出节点的 preg 匹配

php - 正则表达式在html页面上的json字符串中查找字符串

Python - 不理解此串联正则表达式模式的返回结果

regex - 如何在匹配正则表达式的多个文件上运行脚本?

HTML 标签上的 PHP preg_match()