正则表达式:txt vs tx?

时间:2017-01-06 14:25:30

标签: regex powershell

我正在尝试使用RegEx来验证通配符,我遇到了区分\ somefile.tx的问题?和\ somefile.txt。 我已经走到了这一步

\\[^\\]*\.[a-zA-Z0-9 ?]{3}$

会捕获tx ?,但它也会捕获txt。我如何修改它以捕获"三个字母数字或问号,一个至少必须是一个问号"

目前我正在使用多重匹配选项Regex

\\\*|\\\*\.\*$|\\.\.\*$|\*\.[a-zA-Z0-9 ?]{3}$|\\[^\\]*\.[a-zA-Z0-9 ?]{3}$|\\[^\\]*\.\*$

我开始认为我应该将它移动到一个开关,所以当我匹配.txt或.tx时?或者类似的,我可以简单地测试一下?扩展中的任何位置将其标记为有效的通配符。但是,如果有一种方法可以改进我认为更好的单一RegEx。

2 个答案:

答案 0 :(得分:2)

如果我了解您的情况,这应该有效:

你认为这个正则表达式还不够:

\\[^\\]*\.[a-zA-Z0-9 ?]{3}$

如果您更换此部分:

[a-zA-Z0-9 ?]{3}$

有了这个:

(\?[a-zA-Z0-9\?]{2}|[a-zA-Z0-9\?]\?[a-zA-Z0-9\?]|[a-zA-Z0-9\?]{2}\?)$

我相信你会得到你想要的结果。

请注意\?匹配问号(问号前面没有\,?匹配任何字符

之一)

打破它:

\?[a-zA-Z0-9\?]{2}匹配?接着是2个字母数字或?

[a-zA-Z0-9\?]\?[a-zA-Z0-9\?]匹配一个字母数字或?,后跟?,后跟一个字母数字或?

[a-zA-Z0-9\?]{2}\?匹配2个字母数字或?,后跟?

在此上下文中,3个表达式(上面)中的每一个都是“子表达式”。括号内的子表达式以“|”分隔,表示选择3个子表达式中的一个。 (“|”是“或”运算符)

答案 1 :(得分:1)

这是我想出的:

\\[^\\]*\.(?=.*?\?.*?)[a-zA-Z0-9 ?]{3}$

Regular expression visualization

Debuggex Demo

我添加了这部分:

(?=.*?\?.*?)

在文字点.和与扩展名匹配的部分之间。你的正则表达式的其余部分未被修改。

这是一个积极的前瞻,这是一个零宽度匹配(不会成为比赛的一部分)。

它表示"如果后跟任意数量的字符(非贪婪),后跟文字?,后跟任意数量的字符(非贪婪)。"

它基本上只是想确保问号在前方。如果有,匹配可以继续,您拥有的部分将捕获扩展名。