2013-02-26 84 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 />"); 
} 

第三個子字符串將返回所需的結果。