带有扩展名和字符串的字符串(正则表达式)

时间:2016-03-16 00:55:36

标签: regex string

我想查找没有扩展名的字符串,例如,如果我有:

mynameisjeff.jpeg
mynameisjohn.notanextension
mynameisbob

在字符串集合中,中间和底部是我想要的字符串,但顶部是我想忽略的字符串。

这是我目前的正则表达式:

(.+)[^\.]+

它产生以下结果,似乎忽略了非括号,因此它与

匹配
mynameisjeff.jpeg

这是我试图避免的字符串

2 个答案:

答案 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)