dongyue0225 2013-05-18 16:11
浏览 73

正则表达式结束修饰符在Go程序中不返回结果

I have a simple program in Go to aid in learning regular expressions. It runs in an infinite loop and has 2 channels, one which is used to provide input (input contains regex pattern and subject), and the second one, which provides the output.

usage: main.exe (cat)+ catcatdog

However there is propably something wrong in the code, as i can't seem to get any results with the $ modifier.

For example, i expect "cat" output from

main.exe cat$ cat
dog

yet receive zero results.

Code:

package main

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

type RegexRequest struct {
    regex string
    subject string
}

func main() {
    regexRequests := make(chan *RegexRequest)
    defer close(regexRequests)

    regexAnswers, err := createResolver(regexRequests)
    defer close(regexAnswers)
    if(err != nil) { // TODO: Panics when exited via ctrl+c
        panic(err)
    }

    interact(regexRequests, regexAnswers)
}

func interact(regexRequests chan *RegexRequest, regexAnswers chan []string) {
    for {
        fmt.Println("Enter regex and subject: ")
        reader := bufio.NewReader(os.Stdin)

        line, err := reader.ReadString('
')
        if(err != nil) {
            panic(err)
        }

        regAndString := strings.SplitN(line, " ", 2);
        if len(regAndString) != 2 {
            fmt.Println("Invalid input, expected [regex][space][subject]")
            continue
        }

        regexRequests <- &RegexRequest{ regAndString[0], regAndString[1] }
        result := <- regexAnswers
        var filteredResult []string
        for _, element := range result {
            if(element != "") {
                filteredResult = append(filteredResult, element)
            } else {
                filteredResult = append(filteredResult, "EMPTY");
            }
        }

        fmt.Println(strings.Join(filteredResult, " "))
    }
}

func createResolver(inputChan chan *RegexRequest)(outputChan chan []string, err error) {
    if(cap(inputChan) > 0) {
        return nil, fmt.Errorf("Expected an unbuffered channel")
    }

    outputChan = make(chan []string)
    err = nil

    go func() {
        for {
            var regReq *RegexRequest= (<- inputChan);
            var regex *regexp.Regexp = regexp.MustCompile(regReq.regex)
            outputChan <- regex.FindAllString(regReq.subject, -1)
        }
    }()

    return
}
  • 写回答

1条回答 默认 最新

  • dongzi8191 2013-05-18 17:15
    关注

    Check your regex pattern. For example,

    Enter regex and subject: 
    cat$ cat
    dog
    
    Enter regex and subject: 
    ^cat cat
    dog         
    cat
    
    评论

报告相同问题?

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?