我有搜索包含SQL补丁文件的文件夹的代码。如果文件名符合以下名称格式,我想将文件名添加到数组中:
number-text-text.sql
我会使用什么正则表达式匹配number-text-text.sql
?
是否可以使正则表达式匹配文件名,文件名的number
部分位于两个数字之间?如果是这样,那么Regex的语法是什么?
答案 0 :(得分:1)
这应该有效:
select '4-dfsg-asdfg.sql' ~ E'^[0-9]+-[a-zA-Z]+-[a-zA-Z]+\\.sql$'
这将TEXT限制为简单的ASCII字符。可能或不是你想要的。 这是在PostgreSQL中测试的。正则表达式风格在实现之间有很大差异。你可能知道吗?
开始^
和结束$
的锚点是可选的,具体取决于您的操作方式。
答案 1 :(得分:1)
以下正则表达式在中途进行:
\d+-[a-zA-Z]+-[a-zA-Z]+\.sql
关于特定范围内的匹配,由于正则表达式没有简单的方法来处理范围,因此它变得更加棘手。要将匹配限制为2到13之间的数字的文件名,这是正则表达式:
([2-9]|1[0-3])-[a-zA-Z]+-[a-zA-Z]+\.sql
答案 2 :(得分:1)
怎么样:
\d+-[^-]+-[^-]+\.sql
编辑:你只想要字母,所以这里没有特定的范围。
\d+-[a-z]+-[a-z]+\.sql
- 您还需要使用i
标志,不知道如何在c#中完成,但这里是js / perl:
/\d+-[a-z]+-[a-z]+\.sql/i
范围更难。以下是如何匹配0-255的示例:
([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
所以为了匹配(0-255)-text-text.sql,你有这个:
/^(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])-[a-z]+-[a-z]+\.sql/i
(我把数字放在一个非捕获组中,并从字符串的开头匹配,以防止数字部分匹配,以防你想要编号的组或其他东西)。
基本上每当你需要另一个数字的可能性时,你需要在这个案例中添加一个新条件。您想要匹配的数字越小,您需要的案例就越多。你想要的最小/最大值是多少? AFAIK没有一种简单的方法可以动态地做到这一点(虽然我喜欢有人告诉我我错了)。
解决这个问题的最简单方法是简单地捕获数字,并使用原生语法查看它是否在您的范围内。 js中的示例:
var match = filename.match(/(\d+)-[a-z]+-[a-z]+\.sql/i);
if(match && match[1] < maximumNumber && match[1] > minimumNumber){
doStuff();
}
答案 3 :(得分:1)
你的正则表达式应该是:
(\d+)-[a-zA-Z]+-[a-zA-Z]+\.sql
然后,您将使用第一个捕获的组来检查您的号码是否在您想要的两个号码之间。不要试图检查数字是否在具有正则表达式的范围内;分两步完成。你的代码会更加清晰。