如何解决使用正则表达式从原始数据中提取文件名 第一第二
这是我的原始数据:
h24-71-249-14.ca.shawcable.net - - [07/Mar/2004:22:29:13 - 0800] "GET /icons/gnu-head-tiny.jpg HTTP/1.1" 200 3049
h24-71-249-14.ca.shawcable.net - - [07/Mar/2004:22:29:13 - 0800] "GET /icons/gnu-head-tiny HTTP/1.1" 200 3049
我希望能够从URI中提取文件名(如果有,则没有-忽略)。该文件可以是任何文件类型(jpg,png,txt等)
这是我到目前为止所拥有的:
(\"+)(.*?)(\.\w{1,3})
我知道从"
开始我的字符串可能不是一个好主意,这可能是我遇到问题的原因,所以我想寻求一些帮助来修复我的正则表达式。
谢谢!
解决方法
您可以从"
开始模式,但是不必转义,重复和捕获它。
如果您想要扩展名和文件名,则可以使用一个捕获组。
您可以使用:
"GET \S+\/(\S+\.\w{1,3})\b
说明
-
"GET
字面上匹配 -
\S+/
匹配1个以上非空格字符,然后匹配最后一个/
-
(\S+\.\w{1,3})
捕获 group 1 ,匹配1个以上非空格字符,一个点和1-3个单词字符 -
\b
单词边界
没有标记语言,例如使用Javascript
const regex = /"GET \S+\/(\S+\.\w{1,3})\b/;
[
"h24-71-249-14.ca.shawcable.net - - [07/Mar/2004:22:29:13 - 0800] \"GET /icons/gnu-head-tiny.jpg HTTP/1.1\" 200 3049","h24-71-249-14.ca.shawcable.net - - [07/Mar/2004:22:29:13 - 0800] \"GET /icons/gnu-head-tiny HTTP/1.1\" 200 3049"
].forEach(s => {
let m = s.match(regex);
if (m) console.log(m[1]);
})
如果支持\K
,则只能获得匹配项。根据评论,此模式将获得所需的特定匹配:
\w{1,5} \S+\/\K\S+\.\w{3}\b
说明
-
\w{1,5}
匹配1-5个字符和一个空格 -
\S+\/
匹配1+个非空格字符,然后匹配最后一个/
-
\K
重置匹配缓冲区(直到现在忘记匹配的内容) -
\S+
匹配1个以上非空格字符 -
\.\w{3}
匹配一个点和1-3个单词字符 -
\b
单词边界
这里有两个选项:
第一
如果您想要GET
和 HTTP
之间的值,可以这样做:
| rex field=_raw "GET\s+(?<fname>\S+)\s+HTTP"
从字符串文字GET
开始,使用一个(或多个)空格,然后将不是 的所有内容都放入一个空格字符(直到以字符串文字{ {1}})进入新字段HTTP
。
从功能上讲,您可以将fname
从正则表达式中删除,但是出于丰满度的考虑,您可能希望选择将其保留在其中。
第二
如果只需要结尾文件名,就是这样:
\s+HTTP
这将匹配| rex field=_raw "(?<fname>[\.\-\w]+)\s+HTTP"
,.
和所有单词字符(-
)的所有实例,其匹配次数是在一系列空白字符({{1} }),然后将字符串文字\w
插入新字段\s+
。
或者(可选)(尽管找到匹配项的步骤更多,但可能会更好):
HTTP
该字符将匹配所有非斜杠(fname
)的内容,直至一系列空格,其后跟随| rex field=_raw "(?<fname>[^\/]+)\s+HTTP"
到新字段/
中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。