我有一个原始的 http 响应如下:
1
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
|first
我需要从中提取 44001 部分。
我可以使用 Start : |555 End : | 来唯一标识这个字符串。
我试过了
(.*)(|555)(.*)(|)
返回 1。
在旁注中,我在 Jmeter 中使用这个正则表达式,它遵循 java 脚本样式的正则表达式。
我有一个原始的 http 响应如下:
1
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
|first
我需要从中提取 44001 部分。
我可以使用 Start : |555 End : | 来唯一标识这个字符串。
我试过了
(.*)(|555)(.*)(|)
返回 1。
在旁注中,我在 Jmeter 中使用这个正则表达式,它遵循 java 脚本样式的正则表达式。
如果这是模式,这将起作用:
\|555(\d+)\|
它匹配555
两个管道之后和之间的部分。
试试这个 :
$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);
乍一看,您的正则表达式存在两个问题:
首先是管道字符在正则表达式中具有特殊含义,它表示或。因此,例如这个正则表达式:
[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]*)\|
希望有帮助。
使用explode()
它会更快
参考: http: //php.net/manual/en/function.explode.php
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 />");
}
第三个子字符串将返回所需的结果。