提取字符串我有如下原料http响应:正则表达式:从管sperated文件
1
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
|first
我需要从中提取44001部。
我可以唯一地标识使用开始字符串:| 555结束:|
我已经试过
(.*)(|555)(.*)(|)
返回1.
在侧面说明,我使用的regex的JMeter随后的Java脚本风格的正则表达式。
提取字符串我有如下原料http响应:正则表达式:从管sperated文件
1
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
|first
我需要从中提取44001部。
我可以唯一地标识使用开始字符串:| 555结束:|
我已经试过
(.*)(|555)(.*)(|)
返回1.
在侧面说明,我使用的regex的JMeter随后的Java脚本风格的正则表达式。
有两个问题与您正则表达式,我可以看到乍一看:
首先是管道字符在正则表达式中有特殊含义,意思是OR。因此,例如,这个正则表达式:
[abc|def]
将匹配'abc'或'def'。
这意味着您正则表达式的部分“(| 555)”和“(|)”的意思是第二种情况对于第一种情况“Nothing或555”和“Nothing或无”。
如果你想你需要逃避它的管道字符匹配,因此“|”变成'\ |'。
第二个问题是:*是一个贪婪的匹配器,它会尽可能地匹配,并且由于你的点代表任何字符,所以你将得到一个匹配到下一个匹配组的方式。
因此,如果我们解决管道问题,并得到这个新的正则表达式:
.*\|555(.*)\|
使用您的示例字符串中,*匹配:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^^^^^^^^^^^^^^
换句话说,它尽可能匹配它可以直到下一个小组匹配。
您可以从贪婪到懒惰通过添加额外的切换?最后,'。*'变成'。*?“这将停止一旦作出了匹配匹配,你的正则表达式现在是:
.*\|555(.*?)\|
和你匹配组现在变成:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^
如果你知道后面的字符555将永远是数字,那么你可以限制你的匹配组只是数字,而不用担心贪婪和懒惰:
.*\|555([0-9]*)\|
希望有所帮助。
试试这个:
$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);
你的正则表达式部分是完美的。但正则表达式进入jmeter,它不能处理php代码。谢谢! – user1263746 2013-02-26 07:10:34
使用explode()
这将是更快
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 />");
}
第三个子字符串将返回所需的结果。
我选择你的答案作为深入解释的正确答案。谢谢! – user1263746 2013-02-26 10:34:01