正则表达式:从管道分离文件中提取字符串

时间:2013-02-26 06:56:26

标签: javascript regex jmeter

我有一个原始的http响应如下:

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

我需要从中提取44001部分。

我可以使用Start:| 555 End:|

唯一标识此字符串

我试过了

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

返回1.

在旁注中,我在Jmeter中使用这个正则表达式,它遵循java脚本样式的正则表达式。

5 个答案:

答案 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()它会更快

参考:http://php.net/manual/en/function.explode.php

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

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