2014-02-17 5 views
0

Я пытаюсь создать простую функцию ввода даты в командной строке.Regex match делает странные вещи для меня

Я получаю странное поведение при использовании соответствия регулярному выражению с golang: правильный шаблон mach возвращает false, но беспорядок с моим циклом, а неправильный шаблон просто возвращает false. Вот функция, которая производит ошибку:

func ReadDate(fieldname string) (value string) { 
    var validID = regexp.MustCompile(`^\d\d\d\d\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dez)\s\d\d$`) 
    for { 
     value = "" 
     fmt.Printf("%s - e.g. 2014 Jan 01: ", fieldname) 
     fmt.Scanf("%s\n", &value) 
     if value == "" { 
      break // empty value is ok for input 
     } 
     fmt.Printf("validid %v\n", validID.MatchString(value)) 
     if validID.MatchString(value) { 
      break 
     } else { 
      fmt.Printf("invalid entry, try again..\n") 
     } 
    } 
    return 
} 

, когда я запускаю его, я получаю следующее:

date - e.g. 2014 Jan 01: x 
validid false 
date - e.g. 2014 Jan 01: x 
validid false 
date - e.g. 2014 Jan 01: 2014 Jan 01 
validid false 
date - e.g. 2014 Jan 01: validid false 
date - e.g. 2014 Jan 01: validid false 
date - e.g. 2014 Jan 01: 

Обратите внимание, как последняя запись с правильным рисунком выполняется еще два раза через бесконечный цикл и затем останавливается. Любые идеи, почему это может произойти?

Go версии 1.2 Linux/386

ответ

4

проблема Scanf возвращается прежде, чем вся строка читается. Я изменил код для использования bufio.Scanner и os.Stdin, и теперь он работает:

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
    "regexp" 
) 

func ReadDate(fieldname string) (value string) { 
    var validID = regexp.MustCompile(`^\d\d\d\d\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dez)\s\d\d$`) 
    fmt.Printf("%s - e.g. 2014 Jan 01: ", fieldname) 

    scanner := bufio.NewScanner(os.Stdin) 
    for scanner.Scan() { 
     value = scanner.Text() 
     fmt.Printf("Read value: '%s'\n", value) 
     if value == "" { 
      break // empty value is ok for input 
     } 
     fmt.Printf("validid %v\n", validID.MatchString(value)) 
     if validID.MatchString(value) { 
      break 
     } else { 
      fmt.Printf("invalid entry, try again..\n") 
     } 
     fmt.Printf("%s - e.g. 2014 Jan 01: ", fieldname) 

    } 
    return 
} 

func main() { 
    fmt.Println("Returned ", ReadDate("foo")) 
} 
Смежные вопросы