tools: omit outer quotes quotes in matches

This commit is contained in:
Taylor Blau 2017-02-21 11:31:24 -07:00
parent 4a25341669
commit 7ec512c72f
2 changed files with 33 additions and 18 deletions

@ -5,7 +5,7 @@ import "regexp"
var (
// quoteFieldRe greedily matches between matching pairs of '', "", or
// non-word characters.
quoteFieldRe = regexp.MustCompile("'.+'|\".+\"|\\S+")
quoteFieldRe = regexp.MustCompile("'(.+)'|\"(.+)\"|(\\S+)")
)
// QuotedFields is an alternative to strings.Fields (see:
@ -13,10 +13,25 @@ var (
// pairs of quotation delimeters.
//
// For instance, the quoted fields of the string "foo bar 'baz etc'" would be:
// []string{"foo", "bar", "'baz etc'"}
// []string{"foo", "bar", "baz etc"}
//
// Whereas the same argument given to strings.Fields, would return:
// []string{"foo", "bar", "'baz", "etc'"}
func QuotedFields(s string) []string {
return quoteFieldRe.FindAllString(s, -1)
submatches := quoteFieldRe.FindAllStringSubmatch(s, -1)
out := make([]string, 0, len(submatches))
for _, matches := range submatches {
var str string
for _, m := range matches[1:] {
if len(m) > 0 {
str = m
break
}
}
out = append(out, str)
}
return out
}

@ -26,25 +26,25 @@ func TestQuotedFields(t *testing.T) {
"simple trailing": {"foo bar ", []string{"foo", "bar"}},
"simple leading": {" foo bar", []string{"foo", "bar"}},
"single quotes": {"foo 'bar baz'", []string{"foo", "'bar baz'"}},
"single quotes trailing": {"foo 'bar baz' ", []string{"foo", "'bar baz'"}},
"single quotes leading": {" foo 'bar baz'", []string{"foo", "'bar baz'"}},
"single quotes": {"foo 'bar baz'", []string{"foo", "bar baz"}},
"single quotes trailing": {"foo 'bar baz' ", []string{"foo", "bar baz"}},
"single quotes leading": {" foo 'bar baz'", []string{"foo", "bar baz"}},
"double quotes": {"foo \"bar baz\"", []string{"foo", "\"bar baz\""}},
"double quotes trailing": {"foo \"bar baz\" ", []string{"foo", "\"bar baz\""}},
"double quotes leading": {" foo \"bar baz\"", []string{"foo", "\"bar baz\""}},
"double quotes": {"foo \"bar baz\"", []string{"foo", "bar baz"}},
"double quotes trailing": {"foo \"bar baz\" ", []string{"foo", "bar baz"}},
"double quotes leading": {" foo \"bar baz\"", []string{"foo", "bar baz"}},
"nested single quotes": {"foo 'bar 'baz''", []string{"foo", "'bar 'baz''"}},
"nested single quotes trailing": {"foo 'bar 'baz'' ", []string{"foo", "'bar 'baz''"}},
"nested single quotes leading": {" foo 'bar 'baz''", []string{"foo", "'bar 'baz''"}},
"nested single quotes": {"foo 'bar 'baz''", []string{"foo", "bar 'baz'"}},
"nested single quotes trailing": {"foo 'bar 'baz'' ", []string{"foo", "bar 'baz'"}},
"nested single quotes leading": {" foo 'bar 'baz''", []string{"foo", "bar 'baz'"}},
"nested double quotes": {"foo \"bar \"baz\"\"", []string{"foo", "\"bar \"baz\"\""}},
"nested double quotes trailing": {"foo \"bar \"baz\"\" ", []string{"foo", "\"bar \"baz\"\""}},
"nested double quotes leading": {" foo \"bar \"baz\"\"", []string{"foo", "\"bar \"baz\"\""}},
"nested double quotes": {"foo \"bar \"baz\"\"", []string{"foo", "bar \"baz\""}},
"nested double quotes trailing": {"foo \"bar \"baz\"\" ", []string{"foo", "bar \"baz\""}},
"nested double quotes leading": {" foo \"bar \"baz\"\"", []string{"foo", "bar \"baz\""}},
"mixed quotes": {"foo 'bar \"baz\"'", []string{"foo", "'bar \"baz\"'"}},
"mixed quotes trailing": {"foo 'bar \"baz\"' ", []string{"foo", "'bar \"baz\"'"}},
"mixed quotes leading": {" foo 'bar \"baz\"'", []string{"foo", "'bar \"baz\"'"}},
"mixed quotes": {"foo 'bar \"baz\"'", []string{"foo", "bar \"baz\""}},
"mixed quotes trailing": {"foo 'bar \"baz\"' ", []string{"foo", "bar \"baz\""}},
"mixed quotes leading": {" foo 'bar \"baz\"'", []string{"foo", "bar \"baz\""}},
} {
t.Log(desc)
c.Assert(t)