我想从前两对管道之间的以下推文中提取信息。
"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管道之间。我想排除除前两个之外的所有其他管道。可能吗。
我的正则表达式
(?<=||)(.*?)(?=||)
我无法弄清楚如何包含前两个“||”而忽略其他人。
由于
答案 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的工作示例。我想分裂函数应该是相似的,并且可以使用你正在使用的任何编程语言。
答案 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正则表达式。
如果它是“扩展”正则表达式,则无需像'|'那样逃避特殊字符但其他非特殊字符将被逃脱。因此,文字管道将被转义。
像这样的正则表达式应该匹配:^([^\|]+\|)*\|([^|]*)
然后在第二个反向引用中,您将获得所需的字符串。