🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 在 if 语句中使用正则表达式 > Some people, when confronted with a problem think; _I know, I’ll use regular expressions._ Now they have two problems. > > — Jamie Zawinski 你可以在 if 语句中使用另一种类型的表达式,即 **正则表达式**(**regular expression**)。 正则表达式是一种使用模式匹配的强大的字符串比较方式。 #### 操作步骤 在你的配置清单中添加如下代码: ``` if $lsbdistdescription =~ /LTS/ { notice("Looks like you are using a Long Term Support version of Ubuntu.") } else { notice("You might want to upgrade to a Long Term Support version of Ubuntu...") } ``` #### 工作原理 Puppet 将两个斜线之间的文本当做正则表达式对待,两个各斜线之间的文本就是要匹配的内容。 如果正则表达式匹配成功,if 表达式为真,第一个大括号之间的代码就会被执行。 若要使用匹配的反逻辑,即不匹配,需要使用 !~ 替代 =~ ,例如: ``` if $lsbdistdescription !~ /LTS/ { ``` #### 更多用法 正如 Jamie Zawinski 指出的,正则表达式虽然强大,但难于理解和调试。 如果你发现自己所写的正则表达式相当复杂,以至于一眼看上去不能被理解, 就应该考虑简化设计使正则表达式更易懂。 然而,正则表达式的一个特别有用的功能是能够捕获模式。 ##### 捕捉模式 你不仅可以使用正则表达式匹配文本,还可以捕获匹配的文本并将其存储在变量中: ``` $input = "Puppet is better than manual configuration" if $input =~ /(.*) is better than (.*)/ { notice("You said '$0'. Looks like you're comparing $1 to $2!") } ``` 结果为: ``` You said 'Puppet is better than manual configuration'. Looks like you're comparing Puppet to manual configuration! ``` 变量 $0 存储了所有匹配的文本(假设整体匹配成功)。 如果你将一部分正则表达式置于一对圆括号中,就会创建一个 **组**(**group**), 并且所有被匹配的组都会存储在变量中。 第一个被匹配的组是 $1,第二个是 $2,以此类推,正如上例展示的那样。 ##### 正则表达式语法 Puppet 使用了 Ruby 正则表达式语法(Regular expression syntax)的一个子集,如果你还不熟悉正则表达式, 下面网址中的解释会对你有用: [http://gnosis.cx/publish/programming/regular_expressions.html](http://gnosis.cx/publish/programming/regular_expressions.html) 。 #### 参见本书 * 本章的 [使用正则表达式替换](#ch03sec11) 一节