我有2个字符串,它们是2条记录
string1 = "abc/BS-QANTAS\\/DS-12JUL15\\dfd"
string2 = "/DS-10JUN15\\/BS-AIRFRANCE\\dfdsfsdf"
BS正在预订航空公司 DS是日期
我想使用单个正则表达式并提取预订来源&日期。如果可行,请告诉我。 我已经尝试过前瞻但仍无法实现
目标语言是Splunk而不是Javascript。 无论语言是什么,请发布我将在Splunk中试一试
答案 0 :(得分:1)
答案 1 :(得分:1)
这是miroxlav's answer的更具可伸缩性(更具可读性的IMO)替代方案:
(?:\/BS-(?P<source>\w+)|\/DS-(?P<date>\w+)|[^\/\v]+)+
我假设您感兴趣的字段始终以斜线开头。这允许我使用[^/]+
安全地消费它们之间/周围的垃圾。
这实际上是一个包含在一个组中的三个正则表达式,以便为每个人提供轮流匹配的机会,并且应用多次。如果第一个备选匹配,则您正在查看“源航空公司”字段,并且名称将在名为“source”的组中捕获。如果然后第二个替代匹配,则查看日期,该日期在“日期”组中捕获。
但是,因为字段不是按预定顺序,所以正则表达式必须匹配整个字符串以确保匹配两个字段(事实上,我应该使用开始和结束锚点 - ^
和$
- 强制执行;我在下面添加了它们。第三种选择[^/]+
允许它消耗前两个不能的部分,从而使整体匹配成为可能。这是更新的正则表达式:
^(?:\/BS-(?P<source>\w+)|\/DS-(?P<date>\w+)|[^\/\v]+)+$
...以及更新后的demo。正如评论中所指出的,\v
只是因为我将你的两个例子组合成一个多行字符串并进行两次匹配。你不应该在现实生活中需要它。
答案 2 :(得分:0)
这样,您就可以在匹配组airline1
+ date1
或airline2
+ date2
中填充两个字符串:
((BS-(?<airline1>\w+).*DS-(?<date1>[\w]+))|(DS-(?<date2>[\w]+).*BS-(?<airline2>\w+)))
由于只有2组,我使用了简单的排列。
如果还有更多,那么这个正则表达式会占用最后一次。如果你需要最早的(使用lookbehind),请告诉我。