我有一个原始的http响应如下:
1
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
|first
我需要从中提取44001部分。
我可以使用Start:| 555 End:|
唯一标识此字符串我试过了
(.*)(|555)(.*)(|)
返回1.
在旁注中,我在Jmeter中使用这个正则表达式,它遵循java脚本样式的正则表达式。
答案 0 :(得分:3)
如果这是模式,这将起作用:
\|555(\d+)\|
它匹配555
之后和两个管道之间的部分。
答案 1 :(得分:1)
试试这个:
$str = '11|CI17438666|IB136180000001|55544001|10.106.1.XXX||first ';
preg_match('/\|555(?P<digits>\d+)\|/',$str,$match);
echo $match['digits'];
OR
$str = '11|CI17438666|IB136180000001|55544001|10.106.1.XXX||first ';
preg_match('/\|555(\d+)+\|/',$str,$match);
echo "<pre>";
print_r($match);
答案 2 :(得分:1)
乍一看我的正则表达式有两个问题:
第一个是管道字符在正则表达式中具有特殊含义,它表示OR。例如,这个正则表达式:
[abc|def]
匹配'abc'或'def'。
这意味着你的正则表达式部分'(| 555)'和'(|)'对于第一种情况意味着'没有OR 555',对于第二种情况意味着'没有或没有'。
如果你想匹配管道角色你需要逃脱它,所以'|'变成'\ |'。
第二个问题是。*是一个贪婪的匹配器,它会尽可能多地匹配,并且由于你的点代表任何角色,你将获得匹配,直到下一个匹配组。
因此,如果我们修复了管道问题并获得了这个新的正则表达式:
.*\|555(.*)\|
使用您的示例字符串,。*匹配:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^^^^^^^^^^^^^^
换句话说,它会尽可能多地匹配,直到下一组匹配。
您可以通过添加额外的内容从贪婪切换到懒惰吗?最后,所以'。''变成'。*?'一旦匹配,这将停止匹配,你的正则表达式现在是:
.*\|555(.*?)\|
您的匹配组现在变为:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^
如果您知道555后面的字符总是数字,那么您可以将匹配组限制为仅数字,而不用担心贪婪和懒惰:
.*\|555([0-9]*)\|
希望有所帮助。
答案 3 :(得分:0)
使用explode()
它会更快
答案 4 :(得分: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 />");
}
第三个子字符串将返回所需的结果。