11

I am trying to write regexp that returns the substring for string that begins with dot and until first space. But I am new in regular expressions, so I tried something like that and it doesn't work at all:

package main

import "fmt"
import "regexp"

func main() {
    re := regexp.MustCompile("\\.* ")
    fmt.Printf(re.FindString(".d 1000=11,12")) // Must return d
    fmt.Printf(re.FindString("e 2000=11"))     // Must return nothing or ""
    fmt.Printf(re.FindString(".e2000=11"))     // Must return nothing or ""
}

this code just white 3 white space in golang. What I am doing wrong?

1
  • regexp.MustCompile("\\..*\\s") works for me, at least for your provided examples. Commented Mar 9, 2014 at 12:43

2 Answers 2

16

While * is the wildcard in glob matching, it's not the wildcard in regex. In regex, . is the wildcard and * means repetition of 0 or more times. You probably want:

re := regexp.MustCompile("\\..* ")

go playground

But you might notice that it's also returning the dot and space. You can use FindStringSubmatch and use a capture group to fix this, and you can use backsticks so that you don't have to double escape things:

re := regexp.MustCompile(`\.(.*) `)
match := re.FindStringSubmatch(".d 1000=11,12")
if len(match) != 0 {fmt.Printf("1. %s\n", match[1])}

go playground

Though I would prefer using \S* (matches non-space characters) instead of .* to get this match, since it'll reduce the possible backtracking:

re := regexp.MustCompile(`\.(\S*) `)

go playground

Sign up to request clarification or add additional context in comments.

3 Comments

Why are you editing out playground links to the code? Via the edit history those links still work perfect well.
@DaveC Are they? I get 'forbidden' when I follow the links now, and play.golang.org does not have the button to save code anymore (pic: i.sstatic.net/sQCu7.png)
@DaveC Looks like it's on my side. There's some firewall maybe =/ I'll roll back
0

The first 2 characters you write \\ mean that you're escaping backslash, so you're expecting backslash as the first character. You should write ^\..*? instead:

  • ^ - means beginning
  • \. - means escaping dot (so together with one above means that you expect dot as the first character)
  • .*? - any character (dot), any number of them (asterisk), not greedy (question mark) until space (space)

Non-greedy means that it will stop at first space not at the last one

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.