正则表达式:从特定字符中提取

时间:2012-08-01 07:12:58

标签: regex special-characters

我想从前两对管道之间的以下推文中提取信息。

"TRV_Insurance" || "Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado" || "en" || "Wed, 04 Apr 2012 14:27:24 +0000" || NH || South Tamworth

即,我只想“受近期TX恶劣天气影响的旅行者客户可以在800.252.4633报告损失,或在http://t.co/NK4z2EpQ #tornado报告

此信息位于第一对teo管道之间。我想排除除前两个之外的所有其他管道。可能吗。

我的正则表达式

(?<=||)(.*?)(?=||)

我无法弄清楚如何包含前两个“||”而忽略其他人。

由于

6 个答案:

答案 0 :(得分:1)

在你的正则表达式中,你还没有逃过|所以他们将充当OR运营商。 正确的正则表达式是:

(?<=(\|\|)(.*?)(?=(\|\|))

答案 1 :(得分:1)

这样的事对我有用:^.*?\|\|(.+?)\|\|。在正则表达式语言中,管道是一个特殊字符(表示OR运算符),因此需要进行转义。由于您需要匹配前两个,因此添加前向锚点(^)将指示正则表达式引擎在字符串的开头开始匹配。

然后,您可以使用组来访问管道之间的内容。

我在Java中尝试过:

Pattern p = Pattern.compile("^.*?\\|\\|(.+?)\\|\\|");
String str = "\"TRV_Insurance\" || \"Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado\" || \"en\" || \"Wed, 04 Apr 2012 14:27:24 +0000\" || NH || South Tamworth";

Matcher m = p.matcher(str);
if (m.find())
{
    System.out.println(m.group(1));
}

收率:

"Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado"

答案 2 :(得分:1)

我认为你在努力工作。正则表达式可能非常困难。

作为一个想法,既然你的数据似乎是可靠的结构和分隔,为什么不把它与分隔符分开呢?

这是一个使用Javascript的工作示例。我想分裂函数应该是相似的,并且可以使用你正在使用的任何编程语言。

http://jsfiddle.net/T8E3g/

答案 3 :(得分:0)

使用此正则表达式:

(?<=(\|\|)|^)(.*?)(?=(\|\|)|$)

答案 4 :(得分:0)

您使用的是哪种语言?

你可以使用这样的模式:

[^|]+

匹配||之间的所有内容,然后提取字符串。

例如在javascript中:

var string = '"TRV_Insurance" || "Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado" || "en" || "Wed, 04 Apr 2012 14:27:24 +0000" || NH || South Tamworth';

var array = string.match(/[^|]+/g);

数组[1]是你的答案; - )

[编辑];如果你不能使用数组,请尝试:

(?<=([^|]\|\|))[^|]+

没有全球旗帜。这种模式对第一个字符串和||使用正向lookbehind,然后除非||,否则捕获所有内容

[编辑];只是为了避免输入数据包含“|”时的问题:

(?<=([^|]\|\|)).+?(?=(\|\|))

答案 5 :(得分:0)

在ibm aql中接受perl正则表达式。

如果它是“扩展”正则表达式,则无需像'|'那样逃避特殊字符但其他非特殊字符将被逃脱。因此,文字管道将被转义。

像这样的正则表达式应该匹配:

^([^\|]+\|)*\|([^|]*)

然后在第二个反向引用中,您将获得所需的字符串。