正则表达式 - 无序提取字符串

时间:2015-08-01 16:27:17

标签: regex splunk

我有2个字符串,它们是2条记录

string1 = "abc/BS-QANTAS\\/DS-12JUL15\\dfd"
string2 = "/DS-10JUN15\\/BS-AIRFRANCE\\dfdsfsdf"

BS正在预订航空公司 DS是日期

我想使用单个正则表达式并提取预订来源&日期。如果可行,请告诉我。 我已经尝试过前瞻但仍无法实现

目标语言是Splunk而不是Javascript。 无论语言是什么,请发布我将在Splunk中试一试

3 个答案:

答案 0 :(得分:1)

你提到你已经尝试过前瞻,看起来怎么样?

(?<=BS-|DS-)(\w+)

Regex101

进行测试

答案 1 :(得分:1)

这是miroxlav's answer的更具可伸缩性(更具可读性的IMO)替代方案:

(?:\/BS-(?P<source>\w+)|\/DS-(?P<date>\w+)|[^\/\v]+)+

我假设您感兴趣的字段始终以斜线开头。这允许我使用[^/]+安全地消费它们之间/周围的垃圾。

demo

这实际上是一个包含在一个组中的三个正则表达式,以便为每个人提供轮流匹配的机会,并且应用多次。如果第一个备选匹配,则您正在查看“源航空公司”字段,并且名称将在名为“source”的组中捕获。如果然后第二个替代匹配,则查看日期,该日期在“日期”组中捕获。

但是,因为字段不是按预定顺序,所以正则表达式必须匹配整个字符串以确保匹配两个字段(事实上,我应该使用开始和结束锚点 - ^$ - 强制执行;我在下面添加了它们。第三种选择[^/]+允许它消耗前两个不能的部分,从而使整体匹配成为可能。这是更新的正则表达式:

^(?:\/BS-(?P<source>\w+)|\/DS-(?P<date>\w+)|[^\/\v]+)+$

...以及更新后的demo。正如评论中所指出的,\v只是因为我将你的两个例子组合成一个多行字符串并进行两次匹配。你不应该在现实生活中需要它。

答案 2 :(得分:0)

这样,您就可以在匹配组airline1 + date1airline2 + date2中填充两个字符串:

((BS-(?<airline1>\w+).*DS-(?<date1>[\w]+))|(DS-(?<date2>[\w]+).*BS-(?<airline2>\w+)))

>> view at regex101.com

由于只有2组,我使用了简单的排列。

如果还有更多,那么这个正则表达式会占用最后一次。如果你需要最早的(使用lookbehind),请告诉我。