-1

我有一个骆驼端点uri

file:///test/csv?sortBy=file:name&include=.*.csv&move=done

我正在使用正则表达式来解析文件名,我使用的正则表达式是.*?:(.*)\??.*

但它未能剥离选项并返回整个字符串

///test/csv?sortBy=file:name&include=.*.csv&move=done

而预期的结果是///test/csv

我的模式有什么问题

4

6 回答 6

2

我建议您不要使用正则表达式来解析 URI,而是使用毫无疑问存在于您使用的任何语言中的功能。

如果您使用 PHP,请访问 http://php.net/manual/en/function.parse-url.php

如果您使用 Perl,请使用 URI 模块:http ://search.cpan.org/dist/URI/URI.pm

最好使用现有的、经过测试的代码而不是编写自己的代码,而且不要误会,正则表达式就是代码。

于 2012-11-26T18:13:38.750 回答
0

您不能在模式中包含任何会消耗问号及其他内容的内容,即问题是您将文字问号及其后面的所有内容与\?.*

相反,您可以匹配除问号以外的所有内容:

^.*?:([^?]*)

这将匹配所有内容,直到遇到第一个问号。

于 2012-11-26T18:12:03.533 回答
0

而不是 using (.*), use([^?]*)这将匹配,直到有一个?.

这是你需要改变的。

于 2012-11-26T18:12:24.173 回答
0

使用这个正则表达式:

^[^:]+:([^\?]+)

现场演示

于 2012-11-26T18:13:02.437 回答
0

.*您在应该有更具体的东西的地方使用了太多:

^[a-z]+:([^?#]*)

您的模式使用(.*),因此它首先尝试匹配整个字符串。然后是\??,这是一个可选的问号(所以如果它丢失了也没关系),然后.*是 ,这是一个可选的任何东西。最终结果是(.*)匹配所有内容。

于 2012-11-26T18:13:30.910 回答
0

我不确定您指的是哪个文件名,如果是请求 uri,还是作为参数的文件名。


如果请求 uri,则使用:

(?<=\/)[^\/][^\?]+

检查这个演示

如果是参数列表中的一个,则使用:

(?<==file:)[^&]+

检查这个演示

于 2012-11-26T19:21:15.967 回答