0

我有一个原始的 http 响应如下:

1
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
|first        

我需要从中提取 44001 部分。

我可以使用 Start : |555 End : | 来唯一标识这个字符串。

我试过了

(.*)(|555)(.*)(|) 

返回 1。

在旁注中,我在 Jmeter 中使用这个正则表达式,它遵循 java 脚本样式的正则表达式。

4

5 回答 5

3

如果这是模式,这将起作用:

\|555(\d+)\|

它匹配555两个管道之后和之间的部分。

于 2013-02-26T06:59:31.453 回答
1

试试这个 :

$str  = '11|CI17438666|IB136180000001|55544001|10.106.1.XXX||first ';
preg_match('/\|555(?P<digits>\d+)\|/',$str,$match);

echo $match['digits'];

或者

$str  = '11|CI17438666|IB136180000001|55544001|10.106.1.XXX||first ';
preg_match('/\|555(\d+)+\|/',$str,$match);

echo "<pre>";
print_r($match);
于 2013-02-26T07:00:57.680 回答
1

乍一看,您的正则表达式存在两个问题:

首先是管道字符在正则表达式中具有特殊含义,它表示或。因此,例如这个正则表达式:

[abc|def]

将匹配“abc”或“def”。

这意味着您的正则表达式部分 '(|555)' 和 '(|)' 对于第一种情况表示 'nothing OR 555',对于第二种情况表示 'nothing OR nothing'。

如果要匹配管道字符,则需要对其进行转义,因此 '|' 变成'\|'。

第二个问题是 .* 是一个贪婪的匹配器,它会尽可能多地匹配,并且由于您的点代表任何字符,因此您将一直匹配到下一个匹配组。

因此,如果我们解决管道问题并获得这个新的正则表达式:

.*\|555(.*)\|

使用您的示例字符串, .* 匹配:

1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
                               ^^^^^^^^^^^^^^^^^^ 

换句话说,它会尽可能多地匹配,直到下一组匹配。

您可以通过添加额外的 ? 最后,所以 '.*' 变成 '.*?' 一旦进行匹配,这将停止匹配,您的正则表达式现在是:

.*\|555(.*?)\|

您的匹配组现在变为:

1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
                               ^^^^^ 

如果您知道 555 后面的字符将始终是数字,那么您可以将匹配组限制为仅数字,而不必担心贪婪和懒惰:

.*\|555([0-9]*)\|

希望有帮助。

于 2013-02-26T07:22:56.587 回答
0

使用explode()它会更快

参考: http: //php.net/manual/en/function.explode.php

于 2013-02-26T07:02:14.260 回答
0
var str = "11|CI17438666|IB136180000001|55544001|10.106.1.XXX||first";
var pattern = "(.*)(/|555)([0-9]*)(/|)";
var result = str.match(pattern);
// The matches are in elements 0 through n.
for (var index = 0; index < result.length; index++)
{
    document.write ("submatch " + index + ": " +  result[index]);
    document.write("<br />");
}

第三个子字符串将返回所需的结果。

于 2013-02-26T08:05:13.407 回答