正则表达式,实现if...then...else

正则 表达 编程技术
发布日期 2023-08-28 更新日期 2023-08-28 阅读次数 113 文章字数 904

正则的分支符号为|,例如 (a|b) 表示a或者b

在这个基础上,加上环视语法【也称零宽断言,不会占用字符】

先讲一讲零宽断言,零宽断言都是非捕获型。和我们已知的 (?:) 有点相似,不过(?:)仅方便组织正则表达式

环视就是前瞻后顾,找一个合适的位置

一、A(?=B)  查找后面是B的A,正前瞻

二、A(?!B) 查找后边不是B的A,负前瞻

三、(?<=B)A 查找前面是B的A,正后顾

四、(?<!B)A 查找前面不是B的A

说一下if分支语法

完整语法:(?(?=Expression)yes|no)

缩写:(?(Expression)yes|no)

这里的|no不存在时可以省略

一个比较完整的参考文档:正则表达式语言 - 快速参考 | Microsoft Learn

一个完整的php正则表达式例子:

//已知数据为k=v,空格分开,并且v可能带单引号
$settings = “ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='404触发记录'”;

//(?(?='))表示v是单引号开头,则'.*?',否则[\S]+
preg_match_all("/(\S+?)=(?(?=')('.*?')|([\S]+))/",$settings,$output);  

sItemCount = count($output2[1]);  //匹配的key,2是引号结果,3是非引号结果
$kvSettings = array();
for($i=0;$i<$sItemCount;$i++){
    $kvSettings[$output2[1][$i]] = $output2[2][$i] ?: $output2[3][$i];  //先取引号,再取非引号
}

看起来很像的原子组

原子组(Atomic group)语法 (?> subexpression),表意“禁止回溯”。

它匹配过的子字符串不会再进行第二次尝试匹配。

例如,

(?>a*)abc 匹配 aabc

(?>a*) —— aa
abc —— bc = fail

失败。

如果使用回溯语法 (?: subexpression)

(?:a*)abc 匹配 aabc

(?:a*) —— aa
abc —— bc = fail
(回溯,减少前匹配)
(?:a*) —— a
abc —— abc

成功!


文章作者: 朱丰华

文章链接: https://smart.52dixiaowo.com/blog/post-484.html

版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。

正则 表达

发表评论