2024-05-16 23:18:59 发布
网友
我有一个从配置文件读取的python脚本。配置文件将包含一些用户定义的regex模式。但是,我想让用户使用完整的regex模式,或者shell通配符。所以我应该能解释两者
*.txt 以及.*\.txt$ 正确地。所以这两个应该是相等的。在
*.txt
.*\.txt$
不过,我希望能够做到这一点,而不让用户告诉我他们在使用什么。这有可能吗?也许允许使用完整的regex有点过头了。在
可能有一种方法:
尝试将给定表达式编译为正则表达式。在
如果失败(语法错误),则将表达式用作全局字符串。在
如果它没有编译失败,就用它作为正则表达式。
如果它与任何内容都不匹配,请使用它作为全局字符串。
无论如何,告诉用户您做了什么(“将pattern.*解释为正则表达式”),并允许他覆盖您猜测的任何内容。毕竟,正如Zak Thompson所写的,有些模式既可以是有效的regex,也可以是glob模式。在
pattern.*
另一件要考虑的事情是,用户可以通过catastrophic backtracking使用regex很容易过载或使系统崩溃。因此,除非是用户自己的机器,否则您可能会首先考虑允许regex。在
你不能这么做。prefix.*应该匹配什么?那somefiles?呢?它们在regex和glob匹配中有着非常不同的含义,但在这两种情况下都是常见的用例。在
prefix.*
somefiles?
例如,考虑一下模式
foo?.txt
在glob语法中,这将匹配foo1.txt,福兹.txt但不是fo.txt文件, 离岸价.txt或者foozxt 在regexp syntaxt中,这将匹配fo.txt文件,但不是福兹.txt在
两种税你都不能接受。我能想到的唯一选择是让用户给表达式加前缀,即
可能有一种方法:
尝试将给定表达式编译为正则表达式。在
如果失败(语法错误),则将表达式用作全局字符串。在
如果它没有编译失败,就用它作为正则表达式。
如果它与任何内容都不匹配,请使用它作为全局字符串。
无论如何,告诉用户您做了什么(“将
pattern.*
解释为正则表达式”),并允许他覆盖您猜测的任何内容。毕竟,正如Zak Thompson所写的,有些模式既可以是有效的regex,也可以是glob模式。在另一件要考虑的事情是,用户可以通过catastrophic backtracking使用regex很容易过载或使系统崩溃。因此,除非是用户自己的机器,否则您可能会首先考虑允许regex。在
你不能这么做。
prefix.*
应该匹配什么?那somefiles?
呢?它们在regex和glob匹配中有着非常不同的含义,但在这两种情况下都是常见的用例。在例如,考虑一下模式
在glob语法中,这将匹配foo1.txt,福兹.txt但不是fo.txt文件, 离岸价.txt或者foozxt 在regexp syntaxt中,这将匹配fo.txt文件,但不是福兹.txt在
两种税你都不能接受。我能想到的唯一选择是让用户给表达式加前缀,即
^{pr2}$相关问题 更多 >
编程相关推荐