【问题标题】:Regex for splitting params out using preg_match使用 preg_match 拆分参数的正则表达式
【发布时间】:2011-04-17 12:38:18
【问题描述】:

我目前正在使用这个正则表达式:

/([-0-9]+).([-0-9]+).([-0-9]+).([-0-9]+).(.*?).([-0-9]).([-0-9]+).([-0-9.]+).([-0-9.]+).([-0-9.]+).*/i

匹配这种东西:

1 0 61 12345678 sierra007^7 0 0 123.123.123.123:524 26429 25000

我遇到的问题是sierra007^7 这个名字实际上是sierr,然后是它被破坏后的所有内容。我需要的是.*? 部分匹配任何内容,然后继续拆分它。如果将.*? 更改为.*,它会将其余信息放在同一参数中。

有人可以提供一些建议吗?

谢谢。

【问题讨论】:

  • sierra007^7 可以包含哪些可能的值?

标签: php regex


【解决方案1】:

也许我并没有真正看到你需要什么,但为什么不直接使用explode() 来拆分你的字符串呢?

例如这部分代码:

$str = '1 0 61 12345678 sierra007^7 0 0 90.199.42.51:524 26429 25000';
$array = explode(' ', $str);
var_dump($array);

会得到你的:

array
  0 => string '1' (length=1)
  1 => string '0' (length=1)
  2 => string '61' (length=2)
  3 => string '12345678' (length=8)
  4 => string 'sierra007^7' (length=11)
  5 => string '0' (length=1)
  6 => string '0' (length=1)
  7 => string '90.199.42.51:524' (length=16)
  8 => string '26429' (length=5)
  9 => string '25000' (length=5)

【讨论】:

  • 一如既往的有效:“有些人在遇到问题时会想‘我知道,我会使用正则表达式。’现在他们有两个问题。” - 杰米扎温斯基
  • 这是我“继承”的一段现有代码,不知道为什么我不考虑使用 explode 代替 :) 谢谢。当我被允许时会接受。
  • @nfechner: ...和以前一样疲惫。 ;)
【解决方案2】:

而不是(.*?) 使用[^ ]+ 这应该会更快并且可以按照您的预期工作。

【讨论】:

    【解决方案3】:

    我知道原始海报有一个公认的解决方案(效果很好),但请允许我回答为什么正则表达式不起作用的具体问题。问题是使用点. - 这是一个非常常见的错误。点是很少需要或不合适的通配符。在这种情况下,点用于分隔一组数字。但数据表明这些字段是用空格分隔的。解决方法很简单;而不是点,用空格分隔字段。此外,点以 lazy-dot-star 表达式的形式使用,在这种情况下也是不合适的。以下是我将如何编写这个正则表达式(在带有 cmets 的详细模式下):

    $re = '/
        ^               # Anchor to start of line.
        ([-0-9]+)  \s+  # $1: Field 1
        ([-0-9]+)  \s+  # $2: Field 2
        ([-0-9]+)  \s+  # $3: Field 3
        ([-0-9]+)  \s+  # $4: Field 4
        (\S+)      \s+  # $5: Field 5
        ([-0-9])   \s+  # $6: Field 6
        ([-0-9]+)  \s+  # $7: Field 7
        ([-0-9.:]+)\s+  # $8: Field 8
        ([-0-9.]+) \s+  # $9: Field 9
        ([-0-9.]+)      # $10: Field 10
        /mx';
    

    这个正则表达式更加精确,因此匹配(和失败匹配)的速度会更快。

    原始正则表达式的另一个问题是示例字符串的第 8 字段中的数据包含一个冒号,该冒号未在第八个正则表达式中指定,(即"sierr" 不是唯一不匹配的字段.)

    请注意,正则表达式解决方案的优势在于它可以从具有混合可变格式的较大文本正文中挑选出匹配的记录,其中分解解决方案要求每个字符串具有已知的、固定的有效格式(这可能是这里的情况,所以首选explode解决方案)。

    【讨论】:

    • 有没有办法修改它以允许字段 5 中的空格?
    • @webnoob:当然,这很容易。我强烈建议花一两个小时学习基础知识。有一个很好的在线教程:www.regular-expressions.info。你在那里度过的时间会多倍地收回成本。快乐的正则表达式!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多