我有一个正则表达式我需要匹配这样的路径:“C:\Documents and Settings\User\My Documents\ScanSnap\382893.pd~
”。我需要一个匹配所有路径的正则表达式,除了那些以“〜”或“.dat
”结尾的路径。我遇到的问题是我不明白如何匹配和否定确切的字符串'.dat
',并且只在路径的末尾。即我不想在路径的其他地方匹配{d,a,t}
。
我构建了正则表达式,但不需要匹配.dat
[\w\s:\.\\]*[^~]$[^\.dat]
[\w\s:\.\\]*
这匹配所有单词,空格,冒号,句点和退格。
[^~]$[^\.dat]$
这会导致以'〜'结尾的匹配失败。似乎我应该能够跟进'.dat'的否定匹配,但是我的正则表达式测试器中的匹配失败了。
我认为我的答案在于根据我所读到的内容进行分组,有人会指出我正确的方向吗?我应该补充一点,我正在使用一个允许正则表达式匹配的文件观看程序,我只有一行来指定正则表达式。
此条目似乎相似:Regex to match multiple strings
答案 0 :(得分:5)
您想使用negative look-ahead:
^((?!\.dat$)[\w\s:\.\\])*$
顺便说一句,你的角色组([\w\s:\.\\]
)不允许使用波浪号(〜)。如果文件名不在最后,你是否打算允许文件名中的波浪号?如果是这样的话:
^((?!~$|\.dat$)[\w\s:\.\\~])*$
答案 1 :(得分:3)
以下正则表达式:
^.*(?<!\.dat|~)$
匹配任何不以“〜”或“.dat”结尾的字符串。
^ # the start of the string
.* # gobble up the entire string (without line terminators!)
(?<!\.dat|~) # looking back, there should not be '.dat' or '~'
$ # the end of the string
简单地说:只有在从字符串末尾查看后才匹配字符串,没有子字符串'.dat'或'〜'。
编辑:您尝试失败的原因是因为否定的字符类,[^ ...]只会否定单个字符。字符类始终匹配单个字符。因此,当你执行[^ .dat]时,你不是否定字符串“.dat”,而是匹配除“。”,“d”,“a”或“t”之外的单个字符。
答案 2 :(得分:2)
^((?!\.dat$)[\w\s:\.\\])*$
这只是对先前回答建议的评论:
。在一个字符类中,[]是一个文字。并且不需要逃避。
^((?!\.dat$)[\w\s:.\\])*$
我很抱歉将此作为一种新的解决方案发布,但我显然没有足够的可信度来简单地评论答案。
答案 3 :(得分:-2)
我相信你正在寻找这个:
[\w\s:\.\\]*([^~]|[^\.dat])$
像以前一样找到所有单词字符,空格,句点(。),反斜杠。然后匹配字符串末尾的波浪号(〜)或“.dat”。如果你知道字符串应该在新行的开头,你可能还想在最开头添加插入符号(^)。
^[\w\s:\.\\]*([^~]|[^\.dat])$