我正在尝试使用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。
答案 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}$
我添加了这部分:
(?=.*?\?.*?)
在文字点.
和与扩展名匹配的部分之间。你的正则表达式的其余部分未被修改。
这是一个积极的前瞻,这是一个零宽度匹配(不会成为比赛的一部分)。
它表示"如果后跟任意数量的字符(非贪婪),后跟文字?
,后跟任意数量的字符(非贪婪)。"
它基本上只是想确保问号在前方。如果有,匹配可以继续,您拥有的部分将捕获扩展名。