目前,我有以下代碼:cmd := "echo \"Hello world\"!\x00"re := regexp.MustCompile(`[^\s"']+|"([^"]*)"|'([^']*)`)args := re.FindAllString(cmd, -1)fmt.Println("%v", args)這會產生 array %v [echo "Hello world" !],但我希望輸出是%v [echo "Hello world"!](基本上,引號應包含其中的所有內容作為數組中的一項,但終止引號不應表示數組中下一項的立即開始)。我該怎么做呢?
2 回答

白衣染霜花
TA貢獻1796條經驗 獲得超10個贊
改進的正則表達式。這只匹配引用段或非空白段??梢蕴幚礤e誤的單引號。
package main
import (
"fmt"
"regexp"
)
func main() {
cmd := "echo \"Hello world\"!\x00"
re := regexp.MustCompile(`("[^"]+?"\S*|\S+)`)
args := re.FindAllString(cmd, -1)
fmt.Println("%v", args)
fmt.Println("%v", len(args))
}

富國滬深
TA貢獻1790條經驗 獲得超9個贊
您正在顯式匹配"
, 然后是任意數量的^"
, 然后"
, 所以它當然會在第二個之后終止"
。[^\s"']*
如果您將其與(匹配除空格和 ) 之外的任何內容包裝"
在一個分組中,我認為它可能會為您提供所需的內容。讓我知道這個結果是否令人滿意。
re?:=?regexp.MustCompile(`[^\s"']+|([^\s"']*"([^"]*)"[^\s"']*)+|'([^']*)`)
我不是很精通正則表達式的效率,所以如果這給表達式增加了太多的復雜性,請原諒。
編輯:對這個特定表達式的一個警告是,一個單一的"
會把一些東西分成兩個結果,例如hi"there
會分裂成hi
和there
。
- 2 回答
- 0 關注
- 136 瀏覽
添加回答
舉報
0/150
提交
取消