Как проверить строку на наличие одного или нескольких символов - PullRequest
0 голосов
/ 15 января 2019

Я изо всех сил пытаюсь найти способ проверки, чтобы увидеть, содержит ли строка один или несколько символов, таких как следующие: #}{&*"(£) Хотя это довольно тривиально, чтобы проверить один или несколько из этих символов, которые я не ищу создать и поддерживать список или словарь возможных записей. Есть ли способ проверить, содержит ли строка один или несколько любых нестандартных символов в go, предпочтительно используя стандартную библиотеку?

В частности, я ищу, чтобы обнаружить все, что не a-zA-Z0-9, что для моего вопроса будет считаться нестандартным символом.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

В Go напишите простую функцию. Например,

package main

import (
    "fmt"
)

func isStandard(s string) bool {
    for i := 0; i < len(s); i++ {
        switch b := s[i]; {
        case b >= 'a' && b <= 'z':
            continue
        case b >= 'A' && b <= 'Z':
            continue
        case b >= '0' && b <= '9':
            continue
        default:
            return false
        }
    }
    return true
}

func main() {
    fmt.Println(isStandard(`ABCabc123`))
    fmt.Println(isStandard(`#}{&*"(£)`))
}

Детская площадка: https://play.golang.org/p/Y2KjDcHSupH

Выход:

true
false

Спецификация языка программирования Go

Переключение операторов

Операторы «Switch» обеспечивают многофакторное выполнение. Выражение или тип Спецификатор сравнивается с «делами» внутри «переключателя» для определения какую ветку выполнить.

Выключатели экспрессии

В переключателе выражений вычисляется выражение переключателя и выражения case, которые не должны быть константами, оцениваются слева направо и сверху вниз; первый, равный переключателю выражение запускает выполнение операторов связанных дело; другие дела пропущены. Если ни один случай не соответствует и есть «по умолчанию», его операторы выполняются. Там может быть не более одного регистр по умолчанию, и он может появляться где угодно в операторе «switch».

Выражению-переключателю может предшествовать простое утверждение, которое выполняется до вычисления выражения.

Проходные заявления

Оператор "fallthrough" передает управление первому оператору следующее предложение case в выражении «switch». Может быть используется только как последний непустой оператор в таком предложении.


switch b := s[i]; {
    // ...
}

эквивалентно

switch b := s[i]; true {
    // ...
}

эквивалентно

{
    b := s[i]
    switch true {
        // ...
    } 
}

Простой оператор b := s[i] объявляет b локальной switch { } локальной переменной блока операторов.

Выражения случая оцениваются и сравниваются с true. Если ни один из них не соответствует истине, берется default.

Go, в отличие от C, требует явного fallthrough.

ASCII является подмножеством Unicode UTF-8. Поскольку все стандартные символы являются ASCII, мы можем просто сравнить байты.


Вот простой тест.

Выход:

$ go test standard_test.go -bench=. -benchmem
BenchmarkPeterSO-8    200000000       8.10 ns/op    0 B/op    0 allocs/op
BenchmarkJubobs-8      10000000     222 ns/op       0 B/op    0 allocs/op
$ 

standard_test.go

package main

import (
    "regexp"
    "testing"
)

func isStandard(s string) bool {
    for i := 0; i < len(s); i++ {
        switch b := s[i]; {
        case b >= 'a' && b <= 'z':
            continue
        case b >= 'A' && b <= 'Z':
            continue
        case b >= '0' && b <= '9':
            continue
        default:
            return false
        }
    }
    return true
}

func BenchmarkPeterSO(b *testing.B) {
    std := `ABCabc123`
    for N := 0; N < b.N; N++ {
        isStandard(std)
    }
}

var (
    whitelist  = "A-Za-z0-9"
    disallowed = regexp.MustCompile("[^" + whitelist + " ]+")
)

func IsValid(s string) bool {
    return !disallowed.MatchString(s)
}

func BenchmarkJubobs(b *testing.B) {
    std := `ABCabc123`
    for N := 0; N < b.N; N++ {
        IsValid(std)
    }
}
0 голосов
/ 15 января 2019

Поскольку белый список можно легко определить как регулярное выражение, используйте regexp.MatchString:

package main

import (
    "fmt"
    "regexp"
)

var (
    whitelist  = "A-Za-z0-9"
    disallowed = regexp.MustCompile(fmt.Sprintf("[^%s]+", whitelist))
)

func main() {
    fmt.Println(IsValid("foobar007"))
    fmt.Println(IsValid("foo%bar&007"))
}

func IsValid(s string) bool {
    return !disallowed.MatchString(s)
}

( детская площадка )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...