时间:2021-07-01 10:21:17 帮助过:31人阅读
(?(condition)yes-pattern) (?(condition)yes-pattern|no-pattern)
如果条件满足,使用 yes-pattern,其他情况使用 no-pattern(如果指定了)。 如果有超过 2 个的可选子组,会产生给一个编译期错误。
条件一共有两种。如果在(condition)的括号内是数字组成的文本, 条件在该数字代表的(之前的)子组得到匹配时满足(即使用 yes-pattern)。 考虑下面的模式, 为了使其易于阅读其中增加了一些空白字符(查看PCRE_EXTENDED 选项)并且将其分为三个部分: ( \( )? [^()]+ (?(1) \) )
模式的第一部分匹配一个可选的左括号,并且如果该字符出现, 设置其为第一个子组的捕获子串。第二部分匹配一个或多个非括号字符。 第三部分是一个条件子组,它会测试第一个子组是否匹配,如果匹配到了, 也就是说目标字符串以左括号开始,条件为TRUE, 那么使用 yes-pattern 也就是这里需要匹配一个右括号。其他情况下, 既然 no-pattern 没有出现,这个子组就不匹配任何东西。换句话说, 这个模式匹配一个没有括号的或者闭合括号包裹的字符序列。
如果条件式字符串 (R),它在得到对模式或子模式的递归调用时满足。 在”最上级”, 条件总是false。
如果条件不是数字序列或(R),它就必须是一个断言。这里的断言可以使任意的,积极, 消极,正向,后向都是可以的。考虑这个模式, 同样为了方便阅读, 增加了一些空白字符,并且在第二行有两个可选路径。
(?(?=[^a-z]*[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
条件式一个正向积极断言,匹配一个可选的非小写字母字符序列紧接着一个小写字母。 换一种说法,它测试目标中至少出现一个小写字母,如果小写字母发现, 目标匹配第一个可选分支,其他情况下它匹配第二个分支。 这个模式匹配两种格式的字符串:dd-aaa-dd 或 dd-dd-dd。aaa 代表小写字母, dd 是数字。