我想编写一个正则表达式来匹配以“AMDF”或“SB700”开头并且不以“.tmp”结尾的文件。这将在Java中使用。
^(?:AMDF|SB700).*\.(?!tmp$)[^.]+$
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
final String regex = "^(?:AMDF|SB700).*\\.(?!tmp$)[^.]+$";
final String[] files = {
"AMDF123978sudjfadfs.ext",
"SB700afddasjfkadsfs.ext",
"AMDE41312312089fsas.ext",
"SB701fs98dfjasdjfsd.ext",
"AMDF123120381203113.tmp"
};
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
for (String file:files) {
final Matcher matcher = pattern.matcher(file);
if(matcher.matches()) {
System.out.println(matcher.group(0));
}
}
}
}
AMDF123978sudjfadfs.ext
SB700afddasjfkadsfs.ext
AMDE41312312089fsas.ext
SB701fs98dfjasdjfsd.ext
AMDF123120381203113.tmp
以下仅显示匹配项。
AMDF123978sudjfadfs.ext
SB700afddasjfkadsfs.ext
^
在线的开头断言位置(?:AMDF|SB700)
字面上匹配AMDF
或SB700
.*
任意次数匹配任何字符\.
匹配字面点.
字符(?!tmp$)
负向前瞻确保以下内容与字面上的tmp
不匹配(之后断言该行的结尾以便不匹配.tmpx
,其中x
可以是任何东西)[^.]+
匹配除.
之外的任何角色一次或多次$
在线的末尾断言位置这是另一个有效的例子:
^(SB700 | AMDF)*(\ tmp目录?!){4} $。
一种方法可能是使用负前瞻来尝试使用正则表达式断言文件名不会在.tmp
上结束并使用锚点^
来确保文件名以AMDF
或SB700
开头,如:
^(?!.*\.tmp$)(?:AMDF|SB700)\w*\.\w+$
说明
^
的开头(?!
.*\.tmp$
结尾(?:AMDF|SB700)
匹配的非捕获组\w*
\.
\w+
$
的结尾在Java中它看起来像:
^(?!.*\\.tmp$)(?:AMDF|SB700)\\w*\\.\\w+$