我想查找没有扩展名的字符串,例如,如果我有:
mynameisjeff.jpeg
mynameisjohn.notanextension
mynameisbob
在字符串集合中,中间和底部是我想要的字符串,但顶部是我想忽略的字符串。
这是我目前的正则表达式:
(.+)[^\.]+
它产生以下结果,似乎忽略了非括号,因此它与
匹配mynameisjeff.jpeg
这是我试图避免的字符串
答案 0 :(得分:0)
这匹配任何没有扩展名的内容:/^[^.]+$/
这与任何看起来像扩展名的内容匹配:/^([^.]+)\.(.+)/
并将文件名放在第一组中,扩展名放在第二组中。您需要一组可搜索的扩展程序,您需要对其进行测试。
如果你真的需要,可以在一个正则表达式中使用它,但如果你有很多扩展,它会变得非常冗长和丑陋。
这可能让你分道扬:
if (/^[^.]+$/.test(filename)) {
alert(filename+" has no extension");
} else {
var regex = /^([^.]+)\.(.+)/;
var matches = regex.exec(filename);
alert("The file part is "+matches[1]);
alert("The extension is "+matches[2]);
}
更多:
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}
// testFilename returns true if filename does not match a known file type (i.e. has a recognized extension)
function testFilename(filename) {
var extensions = [ "txt", "html", "foo", "bar" ];
var foo = false;
if (/^[^.]+$/.test(filename)) {
foo = true;
} else {
var regex = /^([^.]+)\.(.+)/;
var matches = regex.exec(filename);
if (!contains(extensions, matches[2].toLowerCase())) {
foo = true;
}
}
return foo;
}
答案 1 :(得分:0)
可以通过使用负向前瞻来完成一个正则表达式:
^(?!.*\.(jpeg|jpg|ext|you|want|to|exclude)$)
(使用python测试)
>>> re.match(r'^(?!.*\.(jpeg|jpg)$)', "foo")
<_sre.SRE_Match object at 0x02216FA0>
(with Match object returned means it matches)
>>> re.match(r'^(?!.*\.(jpeg|jpg)$)', "foo.bar")
<_sre.SRE_Match object at 0x02224060>
(with Match object returned means it matches)
>>> re.match(r'^(?!.*\.(jpeg|jpg)$)', "foo.jpeg.bar")
<_sre.SRE_Match object at 0x02216FA0>
(with Match object returned means it matches)
>>> re.match(r'^(?!.*\.(jpeg|jpg)$)', "foo.jpeg")
>>>
(No Match object returned means it does not match)
如果要将字符串拆分为“文件部分”和“扩展名”,那么您可以通过代码确定,或者为了进一步处理,可以使用此正则表达式完成:
^(.*?)(?:\.([^.]*))?$
这会将最后一个句点之前的部分视为“文件部分”,并将最后一个句点之后的部分视为“扩展名”。文件部分在组1中,而扩展名在组2中
E.g。 (用Python测试)
>>> re.match(r"^(.*?)(?:\.([^.]*))?$", "foo.asdfa.bar").groups()
('foo.asdfa', 'bar')
>>> re.match(r"^(.*?)(?:\.([^.]*))?$", "foo.asdfa.").groups()
('foo.asdfa', '')
>>> re.match(r"^(.*?)(?:\.([^.]*))?$", "foo").groups()
('foo', None)