Javascript 正则表达式:从管道指定文件中提取字符串
我有一个原始http响应,如下所示:Javascript 正则表达式:从管道指定文件中提取字符串,javascript,regex,jmeter,Javascript,Regex,Jmeter,我有一个原始http响应,如下所示: 1 1|CI17438666|IB136180000001|55544001|10.106.1.XXX| |first 我需要从中提取44001份 我可以使用Start:| 555 End:| 我试过了 (.*)(|555)(.*)(|) 返回1 另一方面,我在Jmeter中使用这个正则表达式,它遵循java脚本样式的正则表达式。如果是这样的模式,那么它将起作用: \|555(\d+)\| 它与555之后和两个管道之间的零件相匹配。如
1
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
|first
我需要从中提取44001份
我可以使用Start:| 555 End:|
我试过了
(.*)(|555)(.*)(|)
返回1
另一方面,我在Jmeter中使用这个正则表达式,它遵循java脚本样式的正则表达式。如果是这样的模式,那么它将起作用:
\|555(\d+)\|
它与
555
之后和两个管道之间的零件相匹配。如果是这种模式,这将起作用:
\|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|u match('/\\| 555(?P\d+)\\|/',$str,$match);
echo$match['digits'];
或
$str='11 | CI17438666 | IB136180000001 | 55544001 | 10.106.1.XXX | first';
preg|u match('/\\| 555(\d+)+\\\\|/',$str,$match);
回声“;
打印(匹配);
试试这个:
$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|u match('/\\| 555(?P\d+)\\|/',$str,$match);
echo$match['digits'];
或
$str='11 | CI17438666 | IB136180000001 | 55544001 | 10.106.1.XXX | first';
preg|u match('/\\| 555(\d+)+\\\\|/',$str,$match);
回声“;
打印(匹配);
使用explode()
它会更快
参考资料:使用explode()
它会更快
参考资料:我一眼就能看出您的正则表达式有两个问题:
第一个是管道字符在正则表达式中有特殊的含义,它表示或。例如,这个正则表达式:
.*\|555(.*)\|
将匹配“abc”或“def”
这意味着您的正则表达式节“(| 555)”和“(|)对于第一种情况意味着“nothing或555”,对于第二种情况意味着“nothing或nothing”
如果要匹配管道字符,则需要对其进行转义,因此“|”将变为“\|”
第二个问题是,.*是一个贪婪的匹配器,它将尽可能多地匹配,因为你的点代表任何字符,你将得到一个匹配,直到下一个匹配组
因此,如果我们修复管道问题并获得新的正则表达式:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^^^^^^^^^^^^^^
使用示例字符串,.*匹配:
.*\|555(.*?)\|
换句话说,在下一组匹配之前,它尽可能匹配
你可以通过增加一个额外的参数从贪婪变为懒惰?最后,因此“*”变为“*?”这将在匹配完成后立即停止匹配,您的正则表达式现在是:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^
您的匹配组现在变成:
.*\|555([0-9]*)\|
如果您知道555后面的字符总是数字,那么您可以将匹配组限制为仅数字,而不必担心贪婪和懒惰:
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 />");
}
希望能有所帮助。我一眼就能看出您的正则表达式有两个问题:
第一个是管道字符在正则表达式中有特殊的含义,它表示或。例如,这个正则表达式:
.*\|555(.*)\|
将匹配“abc”或“def”
这意味着您的正则表达式节“(| 555)”和“(|)对于第一种情况意味着“nothing或555”,对于第二种情况意味着“nothing或nothing”
如果要匹配管道字符,则需要对其进行转义,因此“|”将变为“\|”
第二个问题是,.*是一个贪婪的匹配器,它将尽可能多地匹配,因为你的点代表任何字符,你将得到一个匹配,直到下一个匹配组
因此,如果我们修复管道问题并获得新的正则表达式:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^^^^^^^^^^^^^^
使用示例字符串,.*匹配:
.*\|555(.*?)\|
换句话说,在下一组匹配之前,它尽可能匹配
你可以通过增加一个额外的参数从贪婪变为懒惰?最后,因此“*”变为“*?”这将在匹配完成后立即停止匹配,您的正则表达式现在是:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^
您的匹配组现在变成:
.*\|555([0-9]*)\|
如果您知道555后面的字符总是数字,那么您可以将匹配组限制为仅数字,而不必担心贪婪和懒惰:
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 />");
}
希望能有所帮助。var str=“11 | CI17438666 | IB136180000001 | 55544001 | 10.106.1.XXX |第一”;
var pattern=“(.*)(/| 555)([0-9]*)(/|”)”;
变量结果=str.match(模式);
//匹配项位于元素0到n中。
对于(var index=0;index ”);
}
第三个子字符串将返回所需的结果。var str=“11 | CI17438666 | IB136180000001 | 55544001 | 10.106.1.XXX | first”;
var pattern=“(.*)(/| 555)([0-9]*)(/|”)”;
变量结果=str.match(模式);
//匹配项位于元素0到n中。
对于(var index=0;index ”);
}
第三个子字符串将返回所需的结果。您的正则表达式部分非常完美。但是正则表达式放在jmeter内部,jmeter无法处理php代码。谢谢你的正则表达式部分很完美。但是正则表达式放在jmeter内部,jmeter无法处理php代码。谢谢我选择你的答案作为深入解释的正确答案。非常感谢。我选择你的答案作为深入解释的正确答案。非常感谢。