如何在GoLang中检查字符串中是否有特殊字符或字符是否为特殊字符

10
在从输入中读取字符串后,我需要检查其中是否有特殊字符。

2
你能详细说明一下在golang中什么是特殊字符吗? - Mayank Patel
字符如'/','-','|','&'。 - Kipz
4个回答

17
你可以使用strings.ContainsAny来查看是否存在某个符文:
package main

import (
  "fmt"
  "strings"
)

func main() {
  fmt.Println(strings.ContainsAny("Hello World", ",|"))
  fmt.Println(strings.ContainsAny("Hello, World", ",|"))
  fmt.Println(strings.ContainsAny("Hello|World", ",|"))
}

或者,如果您想检查是否仅有ASCII字符,可以使用strings.IndexFunc:

package main

import (
    "fmt"
    "strings"
)

func main() {
    f := func(r rune) bool {
        return r < 'A' || r > 'z'
    }
    if strings.IndexFunc("HelloWorld", f) != -1 {
        fmt.Println("Found special char")
    }
    if strings.IndexFunc("Hello World", f) != -1 {
        fmt.Println("Found special char")
    }
}

最终我检查了除了 ABC...Z 以外的所有内容。 - Kipz

3

根据您对特殊字符的定义,最简单的解决方案可能是在字符串上执行for range循环(产生的是符文而不是字节),并且对于每个符文,检查它是否在允许/禁止符文列表中。

有关字符串、字节和符文之间关系的更多信息,请参见Strings, bytes, runes and characters in Go

Playground example

package main

var allowed = []rune{'a','b','c','d','e','f','g'}

func haveSpecial(input string) bool {
    for _, char := range input {
        found := false
        for _, c := range allowed {
            if c == char {
                found = true
                break
            }
        }
        if !found {
            return true
        }
    }
    return false
}

func main() {
    cases := []string{
        "abcdef",
        "abc$€f",
    }
    for _, input := range cases {
        if haveSpecial(input) {
            println(input + ": NOK")
        } else {
            println(input + ": OK")
        }
    }
}

如果你将 allowed 改为一个映射,那么你就可以获得 O(1) 的访问。 - blackgreen

-1

你想使用unicode包,它有一个很好的函数可以检查符号。

https://golang.org/pkg/unicode/#IsSymbol

package main

import (
    "fmt"
    "unicode"
)

func hasSymbol(str string) bool {
    for _, letter := range str {
        if unicode.IsSymbol(letter) {
            return true
        }
    }
    return false
}

func main() {   
    var strs = []string {
        "A quick brown fox",
        "A+quick_brown<fox",
    }

    for _, str := range strs {
        if hasSymbol(str) { 
            fmt.Printf("String '%v' contains symbols.\n", str)
        } else {
            fmt.Printf("String '%v' did not contain symbols.\n", str)   
        }
    }
}

这将提供以下输出:

String 'A quick brown fox' did not contain symbols.
String 'A+quick_brown<fox' contains symbols.

这适用于像+、<等Unicode字符,但对于像\n等转义序列不会给出正确的输出。 - Nikhita Raghunath
@Nikhita 根据Kipz在主问题中的评论,他并不担心转义字符。问题中也没有提到它们。这可能是该问题的最佳解决方案。 - Andy

-2
我最终做了这样的事情。
alphabet := "abcdefghijklmnopqrstuvwxyz"
alphabetSplit := strings.Split(alphabet, "")
inputLetters := strings.Split(input, "")

for index, value := range inputLetters {
        special:=1
        for _, char :=range alphabetSplit{
            if char == value {
                special = 0
                break
            }
        }

可能有任何问题,因为我曾经用它来处理特定的事情,所以我必须编辑一下才能在这里发布


2
这只是为了迭代字符串而做了很多额外的工作。 - Jonathan Hall
这不允许大写字符,带有变音符号的字符如éñç,非拉丁文字符。基本上任何不是英语的东西都不能通过。 - Roshambo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接