了解正则表达式

2022-08-30 22:14:09

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

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

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

通过模式,我的解释是:

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

问题:

  • 我的上述解释是否正确?
  • 这个前瞻断言到底是怎么回事?
  • 前导和尾随的目的是什么?//

答案 1

我的上述解释是否正确?

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

这个前瞻断言到底是怎么回事?

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

因此,基本上,使用正则表达式匹配字符串将为您提供匹配项:.abcd(?=e)abcdeabcd

这匹配的原因是该字符串实际上包含: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 中用于区分字符串的模式部分和字符串的修饰符部分。分隔符可以是任何字符,尽管我自己更喜欢符号。请记住,如果用作分隔符的字符在模式中使用,则需要对其进行转义。@


答案 2

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

一位同事给我发了这个系列,在看完它们之后,我更习惯使用正则表达式。

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


推荐