我目前正在使用此正则表达式:
/([-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
,然后其后的所有内容都被破坏了。我需要的是.*?
部分匹配任何东西然后继续拆分它。如果将.*?
更改为.*
,则会将其余信息添加到相同的参数中。
有人可以提供一些建议吗?
感谢。
答案 0 :(得分:4)
也许我真的没有看到你需要什么,但为什么不用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)
答案 1 :(得分:2)
而不是(.*?)
使用[^ ]+
,这应该更快,并且可以像你所说的一样工作。
答案 2 :(得分:0)
我知道原始海报有一个公认的解决方案(效果很好),但请允许我回答正则表达式无效的具体问题。问题是使用点.
- 这是一个非常常见的错误。点是一个很少需要或适当的通配符。在这种情况下,点用于分离一组数字组。但数据表明这些字段是用空格分隔的。解决方案很简单;而不是点,用空格分隔字段。此点也以 lazy-dot-star 表达式的形式使用,在这种情况下也不合适。以下是我将如何编写此正则表达式(在带有注释的详细模式中):
$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"
不是唯一的字段是错误项匹配的。)
请注意,正则表达式解决方案的优势在于它可以从具有混合,可变格式的更大文本中挑选出匹配记录,其中爆炸解决方案要求每个字符串都具有已知的固定有效格式(可能是这里的情况,所以爆炸解决方案是首选)。