2013-02-26 41 views
0

提取字符串我有如下原料http响应:正则表达式:从管sperated文件

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

我需要从中提取44001部。

我可以唯一地标识使用开始字符串:| 555结束:|

我已经试过

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

返回1.

在侧面说明,我使用的regex的JMeter随后的Java脚本风格的正则表达式。

回答

1

有两个问题与您正则表达式,我可以看到乍一看:

首先是管道字符在正则表达式中有特殊含义,意思是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]*)\| 

希望有所帮助。

+0

我选择你的答案作为深入解释的正确答案。谢谢! – user1263746 2013-02-26 10:34:01

3

如果是这样的模式,这将工作:

\|555(\d+)\| 

555后两管之间的部分相匹配。

+0

工程很棒。谢谢。 – user1263746 2013-02-26 07:09:37

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); 
+0

你的正则表达式部分是完美的。但正则表达式进入jmeter,它不能处理php代码。谢谢! – user1263746 2013-02-26 07:10:34

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 />"); 
} 

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