【问题标题】:PHP Regex - Finding two consecutive words with unknown number of spaces (" ") between themPHP Regex - 查找两个连续的单词,它们之间有未知数量的空格(“”)
【发布时间】:2011-09-26 14:52:13
【问题描述】:

我正在尝试创建一个 PHP 正则表达式,如果两个单词彼此相邻出现并且它们之间有任意数量的空格,它将匹配。

例如,匹配“Daniel   Baylis”(“Daniel”和“Baylis”之间有 3 个空格)。我试过了,但它似乎不起作用:

"/DANIEL[ ]{1,5}BAYLIS/" (this was to check up to 5 spaces which the most I expect in the data)

"/DANIEL[ ]{*}BAYLIS/"

我需要从大量文本中提取名称,并且名称可以出现在该文本中的任何位置。用户输入错误是造成多个空格的原因。

谢谢大家! - 丹

【问题讨论】:

  • 您也可以先替换过时的空格,然后再匹配它,这应该更容易;)
  • DANIEL[ ]{1,5}BAYLIS 这看起来不错,为什么不起作用?
  • @Kent 我猜是问题所在... ;)
  • 我实际上在我的脚本中使用了 /DANIEL[ ]{1,5}BAYLIS/i 虽然我没有在示例中发布,但它没有得到匹配。 @Kent - 你认为这也应该有效吗?
  • 我用grep -i 测试过,它有效。我尝试的是` echo "Daniel BAYLIS"|grep -iP "Daniel[ ]{1,5}Baylis"`

标签: php regex


【解决方案1】:

/DANIEL[ ]+BAYLIS/ 应该这样做...+ 将覆盖前一个字符(-class)的一次或多次出现,在本例中为垃圾空间。

另外,假设您想匹配任何大小写,您需要将您的正则表达式调整为不区分大小写,我不确定如何在 PHP 中执行此操作(这取决于您使用哪种风格的正则表达式......自从我上次触摸它以来已经很久......)

【讨论】:

  • 那将是 /i 修饰符。在这里使用单词边界也是一个好主意,当然括号不是必需的。 /\bDANIEL +BAYLIS\b/i 应该这样做。
  • @TimPietzcker 我在考虑/i,但在我的脑海中,PHP 中有一组pregi_-namespaced 方法可以有效地处理不区分大小写的正则表达式,而无需添加/i...但正如我所说的那样已经很长时间了...括号只是为了清楚起见。单词边界确实很好,但根据我的理解,问题陈述不需要它们:)
  • 我只是在 preg_replace 函数中使用了 /i 修饰符
  • 值得注意的是\s 用于匹配任何形式的空白(制表符、空格、不间断空格、换行符等)。可能会派上用场。此外,作为参考,+{1,} 的工作方式相同(一个或多个,没有上限),* 的工作方式与 {0,} 相同(零个或多个,没有上限)。
猜你喜欢
  • 2011-03-28
  • 2016-06-10
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多