2016-07-23 8 views
2

Nach dem Lesen von this post, weiß ich, dass ich ein backquotes (`) verwenden muss, um mein Regex-Muster zu umhüllen. Jetzt habe ich Regex Muster /^(?=^.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)[[email protected]#$%^&*()]*$/, um das Passwortmuster zu überprüfen, ob es korrekt ist. Ich habe es mit PHP getestet und es funktioniert einwandfrei. Aber es funktioniert nicht in Go. Warum?Regex-Muster zum Überprüfen von Passwork-Arbeit auf PHP, aber nicht auf Go

Übrigens, was ist der Typ der Backquoted (`) Variable? es scheint nicht string Typ. Wie kann ich diesen Variablencontainer deklarieren?

Testing-Code

package main 

import(
    "fmt" 
    "regexp" 
) 

func main(){ 
    re := regexp.MustCompile(`/^(?=^.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)[[email protected]#$%^&*()]*$/`) 
    fmt.Println(re.MatchString("aSfd46Fgwaq")) 
} 

Testing Ergebnis

Running... 

panic: regexp: Compile(`/^(?=^.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)[[email protected]#$%^&*()]*$/`): error parsing regexp: invalid or unsupported Perl syntax: `(?=` 

goroutine 1 [running]: 
panic(0x4efae0, 0xc82000a340) 
    /usr/local/go/src/runtime/panic.go:481 +0x3e6 
regexp.MustCompile(0x576140, 0x4b, 0x100000000) 
    /usr/local/go/src/regexp/regexp.go:232 +0x16f 
main.main() 
    /home/casper/.local/share/data/liteide/goplay.go:9 +0x30 
exit status 2 

Error: process exited with code 1. 

Thank you!

+4

Go regex nicht lookarounds und regex Begrenzungszeichen nicht unterstützt . –

+0

Gibt es irgendwelche anderen Plugins, die ich von Github für dieses Regex-Muster verwenden kann? – Casper

+0

Der '(?!. * \ S)' Lookahead ist redundant, da das konsumierende Muster nicht mit Whitespaces übereinstimmt. –

Antwort

4

Go Regexp unterstützt keine Lookarounds. Auch die /.../ Regex-Trennzeichen werden nicht unterstützt (es gibt spezielle Methoden in Go, um diese auszudrücken).

Sie entweder ein Lookarounds tragende regex Bibliothek für Go (here is a PCRE-supporting one) oder teilen Sie die Bedingungen und mehrere kleine, gut lesbare regexps verwenden verwenden:

package main 

import (
    "fmt" 
    "regexp" 
    "unicode/utf8" 
) 

func main() { 
    s := "aSfd46Fgwaq" 
    lower_cond := regexp.MustCompile(`[a-z]`) 
    upper_cond := regexp.MustCompile(`[A-Z]`) 
    digit_cond := regexp.MustCompile(`[0-9]`) 
    whole_cond := regexp.MustCompile(`^[[email protected]#$%^&*()]*$`) 
    pass_len := utf8.RuneCountInString(s) 
    fmt.Println(lower_cond.MatchString(s) && upper_cond.MatchString(s) && digit_cond.MatchString(s) && whole_cond.MatchString(s) && pass_len >= 8) 
} 

Go playground demo Siehe

HINWEIS: Ich verwendete utf8.RuneCountInString in die Demo, um sicherzustellen, dass auch die UTF8-Stringlänge korrekt analysiert wird. Andernfalls können Sie verwenden, die Bytes zählt, die für ASCII-Eingabe ausreichen sollten.

aktualisiert

Wenn die Leistung nicht zufriedenstellend ist, können Sie einen einfacheren ohne regulären Ausdrücke Ansatz in Betracht ziehen:

package main 

import "fmt" 

func main() { 
    myString := "aSfd46Fgwaq" 
    has_digit := false 
    has_upper := false 
    has_lower := false 
    pass_length := len(myString) 
    for _, value := range myString { 
     switch { 
     case value >= '0' && value <= '9': 
      has_digit = true 
     case value >= 'A' && value <= 'Z': 
      has_upper = true 
     case value >= 'a' && value <= 'z': 
      has_lower = true 
     } 
    } 
    fmt.Println(has_digit && has_upper && has_lower && pass_length >= 8) 

} 

Siehe another Go demo

+0

Wenn ich Standard-lib-Funktion verwenden, um String-Eingabe zu validieren, wird es schneller sein als mit regexp Methode? Regexp Methode scheint Zeit zu brauchen, um das Regex-Muster zu entschlüsseln. Was würden Sie empfehlen? – Casper