1

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

"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

即,我只想要“受近期德克萨斯州恶劣天气影响的旅行者客户可以在 800.252.4633 或在线http://t.co/NK4z2EpQ #tornado 报告损坏情况”

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

我的正则表达式

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

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

谢谢

4

6 回答 6

1

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

作为一个想法,既然您的数据似乎是可靠地结构化和分隔的,为什么不直接用分隔符拆分它呢?

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

http://jsfiddle.net/T8E3g/

于 2012-08-01T07:38:33.340 回答
1

在您的正则表达式中,您没有逃脱 | 因此他们将充当 OR 运算符。正确的正则表达式是:

(?<=(\|\|)(.*?)(?=(\|\|))
于 2012-08-01T07:18:29.237 回答
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"
于 2012-08-01T07:20:13.877 回答
0

使用这个正则表达式:

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

于 2012-08-01T07:15:37.043 回答
0

ibm aql 接受 perl 正则表达式。

如果它是“扩展”正则表达式,则无需转义特殊字符,例如 '|' 但其他非特殊字符将被转义。所以要转义一个字面管道。

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

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

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

于 2012-08-01T07:38:47.430 回答
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);

array[1] 是你的答案;-)

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

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

没有全局标志。此模式对第一个字符串和 || 使用正向后视,然后捕获所有内容,除非 ||

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

(?<=([^|]\|\|)).+?(?=(\|\|))
于 2012-08-01T07:18:02.773 回答