【问题标题】:Write a regex to get numbers between two delimiters编写一个正则表达式来获取两个分隔符之间的数字
【发布时间】:2013-08-13 18:37:02
【问题描述】:

我需要解析一个字符串并获取两个分隔符之间的数字。我需要确定它们是数字。我尝试了类似的方法,但没有按预期工作。

if (preg_match_all("/[^0-9](?<=First)(.*?)(?=Second)/s", $haystack, $result))
for ($i = 1; count($result) > $i; $i++) {
    print_r($result[$i]);
}

正则表达式有什么问题?

【问题讨论】:

  • 输入是什么,你期望什么,你得到什么?
  • 天哪,这取决于。 $haystack 中有什么内容? $result 中出现了什么?您想在$result 中发布什么内容?
  • 一开始你是怎么想到[^0-9]的,你为什么要使用环视,而不仅仅是文字分隔符和中间的数字匹配?

标签: php regex string parsing delimiter


【解决方案1】:

嗯,这几乎是我提供给你的other questionxD

(.*?) 更改为([0-9]+)

if (preg_match_all("/(?<=First)([0-9]+)(?=Second)/s", $haystack, $result))
for ($i = 1; count($result) > $i; $i++) {
    print_r($result[$i]);
}

.*? 将匹配任何字符(换行符除外)并且仅匹配分隔符“First”和“Second”之间的数字,您需要将其更改为[0-9]。然后,我假设它们之间不可能有任何东西,所以我们使用+ 而不是*

我不知道你一开始为什么使用[^0-9]。通常[^0-9] 表示一个不是数字的字符,将它放在那里并没有真正有用,至少在我看来。


稍微清理一下,您可以删除一些不需要的东西以获得所需的输出:

if (preg_match_all("/(?<=First)[0-9]+(?=Second)/", $haystack, $result))
   print_r($result[0]);

【讨论】:

  • @Martijn 我刚刚看到您建议的编辑,您应该阅读this 了解我为什么使用[0-9] 而不是\d
  • s 模式修饰符在这里没有用,因为模式中没有 .。捕获组在这里没有用,因为捕获的子字符串与全字符串匹配。
【解决方案2】:

您可以使用[0-9]\d 来确保分隔符之间的字符是数字。使用它你也不需要惰性量词(除非你的分隔符实际上也是数字):

preg_match_all("/[^0-9](?<=First)(\d*)(?=Second)/s", $haystack, $result)

或者

preg_match_all("/[^0-9](?<=First)([0-9]*)(?=Second)/s", $haystack, $result)

【讨论】:

  • s 模式修饰符在这里没有用,因为模式中没有 .。捕获组在这里没有用,因为捕获的子字符串与全字符串匹配。
猜你喜欢
  • 2019-05-07
  • 2022-01-18
  • 2019-07-02
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
相关资源
最近更新 更多