18

我厌倦了害怕正则表达式。这篇文章的主题仅限于正则表达式的 PHP 实现,但是,任何通用正则表达式建议显然都会受到赞赏(即不要将我与不适用于 PHP 的范围混淆)。

以下(我相信)将删除数字之间的任何空格。也许有更好的方法可以做到这一点,但我仍然想了解发生了什么。

$pat="/\b(\d+)\s+(?=\d+\b)/";
$sub="123 345";
$string=preg_replace($pat, "$1", $sub);

通过模式,我的解释是:

  • \b一个词的边界
  • \d+1 个或多个数字的子模式
  • \s+一个或多个空格
  • (?=\d+\b)一个或多个数字后跟单词边界的前瞻断言?
  • 把它们放在一起,搜索任何单词边界,后跟一个或多个数字,然后是一些空格,然后对其进行某种前瞻断言,并将结果保存在 $1 中以便它可以替换模式?

问题:

  • 我的上述解释正确吗?
  • 那个前瞻断言到底是关于什么的?
  • 前导/和尾随的目的是什么/
4

2 回答 2

18

我的上述解释正确吗?

是的,你的解释是正确的。

那个前瞻断言到底是关于什么的?

该前瞻断言是一种让您匹配前面具有特定模式的字符的方法,而无需实际匹配该模式。

所以基本上,使用正则表达式abcd(?=e)来匹配字符串abcde会给你匹配:abcd

匹配的原因是该字符串abcde实际上包含:

  1. 一个a
  2. 紧随其后的是b
  3. 紧随其后的是c
  4. 后跟一个d that has an e after it(这是单个字符!)

需要注意的是,在第 4 项之后,它还包含一个实际的“e”字符,我们不匹配。

另一方面,尝试将字符串与正则表达式匹配abcd(?=f)将失败,因为序列:

"a", followed by "b", followed by "c", followed by "d that has an f in front of it"

没有找到。

前导/和尾随/的目的是什么

这些是分隔符,在 PHP 中用于区分字符串的模式部分和字符串的修饰符部分。分隔符可以是任何字符,尽管我@自己更喜欢符号。请记住,如果在您的模式中使用您用作分隔符的字符,则需要对其进行转义。

于 2012-11-30T13:35:43.457 回答
6

观看此视频以及随后的 4 个视频是个好主意:http: //blog.themeforest.net/screencasts/regular-expressions-for-dummies/ 该系列的其余部分可在此处找到: http:// /blog.themeforest.net/?s=regex+for+dummies

一位同事给我发了这个系列,看完之后,我对使用正则表达式感到更加自在。

另一个好主意是安装 RegexBuddy 或 Regexr。尤其是 RegexBuddy 对于理解正则表达式的工作原理非常有用。

于 2012-11-30T13:39:51.587 回答