【问题标题】:Understanding Regular Expressions理解正则表达式
【发布时间】:2012-11-30 13:29:31
【问题描述】:

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

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

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

通过模式,我的解释是:

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

问题:

  • 我的上述解释正确吗?
  • 先行断言到底是什么意思?
  • 前导 / 和尾随 / 的用途是什么?

【问题讨论】:

  • 参考和教程:regular-expressions.info
  • * 另请参阅 Open source RegexBuddy alternativesOnline regex testing 以获得一些有用的工具,或提及 RegExp.info
  • 谢谢。现在只是查看 deceze 的建议。会看看其他人。
  • 虽然基于 ruby​​ 的正则表达式(不确定是否有很大差异),但我还发现 rubular.com 是更容易使用的在线正则表达式测试器之一。
  • 我强烈建议您使用Kodos,以便更轻松地掌握正则表达式技能(调试正则表达式和测试正则表达式语句的不同修改也更容易)。

标签: php regex


【解决方案1】:

我的上述解释正确吗?

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

先行断言是什么意思?

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

所以基本上,使用正则表达式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 中用于区分字符串的模式部分和字符串的修饰符部分。分隔符可以是任何字符,但我更喜欢@ 自己签名。请记住,如果在您的模式中使用您用作分隔符的字符,则需要对其进行转义。

【讨论】:

  • 但是“a”,后跟“b”,后跟“c”,后跟“d”前面有一个e(不是e不是f)不匹配。你能请详细说明。
  • @user1032531 当然,给我一分钟。 Marten,对此感到抱歉,我想我不小心覆盖了您建议的编辑,但该信息现在出现在问题中。
  • 啊哈,分隔符!所以我只有在我有修饰符时才需要它们,对吗?
  • look-aheads 是“零宽度”断言,这意味着它们不包含在匹配中。所以abcd(?=e) 表示匹配abcd 如果它后面跟着e
  • 关于分隔符, preg_replace('[^a-zA-Z0-9_]', '','Hello[$&goodby') 没有任何分隔符(除非方括号充当它们?)。无效吗?
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢 Maarteen00,我去看看。
猜你喜欢
  • 2018-10-17
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
相关资源
最近更新 更多