我有一个骆驼端点uri
file:///test/csv?sortBy=file:name&include=.*.csv&move=done
我正在使用正则表达式来解析文件名,我使用的正则表达式是.*?:(.*)\??.*
但它未能剥离选项并返回整个字符串
///test/csv?sortBy=file:name&include=.*.csv&move=done
而预期的结果是///test/csv
我的模式有什么问题
我有一个骆驼端点uri
file:///test/csv?sortBy=file:name&include=.*.csv&move=done
我正在使用正则表达式来解析文件名,我使用的正则表达式是.*?:(.*)\??.*
但它未能剥离选项并返回整个字符串
///test/csv?sortBy=file:name&include=.*.csv&move=done
而预期的结果是///test/csv
我的模式有什么问题
我建议您不要使用正则表达式来解析 URI,而是使用毫无疑问存在于您使用的任何语言中的功能。
如果您使用 PHP,请访问 http://php.net/manual/en/function.parse-url.php
如果您使用 Perl,请使用 URI 模块:http ://search.cpan.org/dist/URI/URI.pm
最好使用现有的、经过测试的代码而不是编写自己的代码,而且不要误会,正则表达式就是代码。
您不能在模式中包含任何会消耗问号及其他内容的内容,即问题是您将文字问号及其后面的所有内容与\?.*
相反,您可以匹配除问号以外的所有内容:
^.*?:([^?]*)
这将匹配所有内容,直到遇到第一个问号。
而不是 using (.*)
, use([^?]*)
这将匹配,直到有一个?
.
这是你需要改变的。
.*
您在应该有更具体的东西的地方使用了太多:
^[a-z]+:([^?#]*)
您的模式使用(.*)
,因此它首先尝试匹配整个字符串。然后是\??
,这是一个可选的问号(所以如果它丢失了也没关系),然后.*
是 ,这是一个可选的任何东西。最终结果是(.*)
匹配所有内容。