【发布时间】:2017-06-27 12:10:36
【问题描述】:
如果找不到匹配项,是否有任何 regex 表达式返回空值或 null 值?
例如,我有处理这条日志行的正则表达式:
May 5 23:00:01 99.99.99.99 %FRA-8-333344: Built inbound UDP connection 9999888811 for outside:11.111.111.11/47747 (11.111.111.11/47747) to net-9999:22.22.22.22/53 (22.22.22.22/53)
但有时日志会有所不同,例如缺少一个值(例如:缺少连接 ID):
May 5 23:00:01 99.99.99.99 %FRA-8-333344: Built inbound UDP for outside:11.111.111.11/47747 (11.111.111.11/47747) to net-9999:22.22.22.22/53 (22.22.22.22/53)
我的问题是我想处理这个更改,我的想法是如果regex 找不到值,则返回空值。我的下一步是构建 hive 表,因此从regex 提取的值必须具有正确的顺序,例如 UDP 值不能写入连接 id 列。
有人知道这个问题的解决方案吗?在 R 语言中解决方案非常简单 (str_extract_all) 和正则表达式数组,但在 Scala 中我无法处理..
来自第一个日志的键值:
timestamp: May 5 23:00:01
Action: Built
protocol: UDP
connection_id: 9999888811
src_ip: 11.111.111.11
dst_ip: 22.22.22.22
src_port 47747
dst_port 53
第二个日志的键值:
timestamp: May 5 23:00:01
Action: Built
protocol: UDP
connection_id: **EMPTY/NULL/" "**
src_ip: 11.111.111.11
dst_ip: 22.22.22.22
src_port 47747
dst_port 53
对于每一个帮助我将不胜感激:)
28.06.2017 更新
我的正则表达式:https://regex101.com/r/4mtAtu/1
我的解决方案。我认为它会很慢:
case class logValues(time_stamp: String, action: String, protocol: String, connection_id: String, ips: String, ports: String)
def matchLog(x: String): logValues = {
val time_stamp = """^.*?(?=\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s%)""".r.findAllIn(x).mkString(",")
val action = """((?<=:\s)\w{4,10}(?=\s\w{2})|(?<=\w\s)(\w{7,9})(?=\s[f]))""".r.findAllIn(x).mkString(",")
val protocol = """(?<=[\w:]\s)(\w+)(?=\s[cr])""".r.findAllIn(x).mkString(",")
val connection_id = """(?<=\w\s)(\d+)(?=\sfor)""".r.findAllIn(x).mkString(",")
val ips = """(?<=[\d\w][:\s])(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?=\/\d+|\z| \w)""".r.findAllIn(x).mkString("|")
val ports = """(?<=\d/)(\d{1,6})(?=\z|[\s(])""".r.findAllIn(x).mkString("|")
val logObject = logValues(time_stamp, action, protocol, connection_id, ips, ports)
return logObject
}
【问题讨论】:
-
你能发布你当前的正则表达式,它会匹配所有需要的值吗?
-
如果您使用组,则在调用相关的
Matcher#group方法时,您应该能够让索引或命名组与返回null的缺失部分匹配。这完全取决于您的实施。 -
我现在正在尝试简化:您似乎想让
connection_id:在两种情况下都返回匹配项,对吧?因此,您只需要"""connection_id\s*:\s*(\d*)"""并且将填充第 1 组 var。\d*匹配 0 个或多个数字,因此它将返回一个空字符串。 -
查看后视版本示例 - ideone.com/csivBv。请出示您的代码。
标签: java regex scala logparser