我正在尝试匹配正则表达式以提取子字符串的值。 我已经阅读了正则表达式语法,但似乎我仍然无法正确使用它。
我有来自http响应的以下内容:
Content-Disposition: attachment; filename=Subtitle.197747.zip; type=s
Content-Disposition: attachment; filename="file one.txt" type=s
Content-Disposition: attachment; filename="file one.txt"; type=s
Content-Disposition: attachment; filename=Subtitle.197747.zip type=s
如果指定的话,我正在尝试提取文件名的值而不使用双引号。 想出了类似的东西:
`.*filename="?(?<filename>[^;"]*)\s?.*`
但这似乎没有诀窍,我会很感激一些指导。
感谢大家的回答,我全部阅读并继续:
filename="?(?<filename>[^;"]+)[\s;"]
虽然我不确定如何让它正确编译(无论是\或“给我麻烦)。
答案 0 :(得分:2)
试试这个
filename="?(?<filename>[^;"]+)[;"\s]*type
答案 1 :(得分:1)
正则表达式(imo)的技巧是不要求它一次做太多。编写不关心引号的表达式,然后在正常的过程代码中查找引号,并在需要时将其删除。如果需要,您甚至可以使用单独的正则表达式来查找前导/尾随引号(但几乎不需要)。
原因并不是正则表达不适应这项工作。你当然可以将这一切都融入到一个表达中。原因是(再次:imo)正则表达式的复杂性和维护惩罚倾向于以比提供的功能更大的速率增加。那里有一个甜蜜点,正则表达式是完美,优雅的解决方案,但很容易把它拿得太远。
现在你遇到的问题是,表达式末尾附近的\s
符合用于获取值的[^;"]*
字符类,并且因为星号是贪婪的,所以经常永远不会匹配那一部分。根据您的示例,我会使用;? type=s
作为结尾条件。
答案 2 :(得分:0)
你很近,试试
filename="?(?<filename>[^;"]+)["\s]
答案 3 :(得分:0)
首先,您不需要匹配整个字符串,因此可以删除初始和最终.*
:您可以更简单地保存事物。
假设最后一个示例是错误的(请参阅我对Q的评论),您需要filename=
与分号和字符串结尾之间的所有内容。如果引用,该值可能包含分号(根据快速阅读,请参阅RFC2045中value
和token
的定义),如下所示:
filename=("[^"]+"|.+)\s*(;|^)
虽然第二个.+
应该被token
(ASCII子集)中的有效字符的字符类替换。
文件名将是第一次捕获的值。
答案 4 :(得分:0)
有很多答案可以完成这项工作,这是我的:
filename=\"?([^;"]+).*type
为了测试正则表达式,我使用Expresso。这是一个免费下载,为您提供一个简单的英语表示,你的正则表达式实际上正在寻找什么,这是非常方便。