2017-08-09 104 views
2

我正在从目录列表中查找特定文件类型,并使用HasSuffix进行比较以查找几个特定的​​文件类型。我想让这个比较大小写不敏感。不区分大小写HasSuffix in Go

有没有办法将EqualFold或其他不区分大小写的比较添加到HasSuffix函数中?

回答

6

你可以只使用

if strings.HasSuffix(strings.ToLower(s), "suffix") { 
    // do something 
} 

您也可以编写自己的包装函数:

func hasSuffix(s, suffix string, caseSensitive bool) bool { 
    if caseSensitive { 
     return strings.HasSuffix(s, suffix) 
    } 
    return strings.HasSuffix(strings.ToLower(s), suffix) 
} 

对于文件名或路径,你可以使用(见PeterSO的答案):

if strings.ToLower(filepath.Ext(s)) == ".fileending" { 
    // do something 
} 
+1

我不能确定“后缀”的情况下,所以我也将ToLower,以及似乎是最有意义的。 if strings.HasSuffix(strings.ToLower(s),strings.ToLower(extension)){ //做某事 } –

2

“我正在从直接找寻特定文件类型ry上市。我想作这种比较不区分大小写“

例如,

package main 

import (
    "fmt" 
    "io/ioutil" 
    "os" 
    "path/filepath" 
    "strings" 
) 

func hasExts(path string, exts []string) bool { 
    pathExt := strings.ToLower(filepath.Ext(path)) 
    for _, ext := range exts { 
     if pathExt == strings.ToLower(ext) { 
      return true 
     } 
    } 
    return false 
} 

func main() { 
    dir := `./` 
    files, err := ioutil.ReadDir(dir) 
    if err != nil { 
     fmt.Fprintln(os.Stderr, err) 
     return 
    } 
    sourceExts := []string{".go", ".Py", ".c", ".cpp"} 
    for _, fi := range files { 
     if hasExts(fi.Name(), sourceExts) { 
      fmt.Println(fi.Name()) 
     } 
    } 
} 

输出:

t.c 
t.go 
t.py 
t1.go 
t1.py 
t2.go 

对于strings.HasSuffix开始的一种特殊形式,通过复制代码来自strings package

func HasSuffix(s, suffix string) bool { 
    return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix 
} 

然后修改它以适合您的目的。例如,

func hasSuffix(s, suffix string) bool { 
    return len(s) >= len(suffix) && 
     strings.ToLower(s[len(s)-len(suffix):]) == strings.ToLower(suffix) 
}