Tách một chuỗi trên khoảng trắng trong Go?


115

Với một chuỗi đầu vào chẳng hạn " word1 word2 word3 word4 ", cách tiếp cận tốt nhất để tách chuỗi này thành một mảng chuỗi trong Go là gì? Lưu ý rằng có thể có bất kỳ số lượng khoảng trắng hoặc ký tự khoảng cách unicode nào giữa mỗi từ.

Trong Java, tôi sẽ chỉ sử dụng someString.trim().split("\\s+").

(Lưu ý: có thể trùng lặp Chuỗi phân tách bằng cách sử dụng biểu thức chính quy trong Go không đưa ra bất kỳ câu trả lời chất lượng nào. Vui lòng cung cấp một ví dụ thực tế, không chỉ là một liên kết đến tham chiếu regexphoặc stringsgói.)

Câu trả lời:


248

Các stringsgói có một Fieldsphương pháp.

someString := "one    two   three four "

words := strings.Fields(someString)

fmt.Println(words, len(words)) // [one two three four] 4

DEMO: http://play.golang.org/p/et97S90cIH

Từ các tài liệu:

func Fields(s string) []string

Các trường chia nhỏ chuỗi sxung quanh mỗi trường hợp của một hoặc nhiều ký tự khoảng trắng liên tiếp, trả về một mảng các chuỗi con shoặc danh sách trống nếu s chỉ chứa khoảng trắng.


1
Thật không may, strings.Fieldsđừng bỏ qua khoảng trắng trong các phần được trích dẫn.
chmike 21/12/18

@chmike Đúng, nhưng thời điểm dấu ngoặc kép có liên quan, bạn đang kinh doanh giải mã hoặc phân tích một số mã hóa hoặc định dạng cụ thể .
mtraceur

@chmike bạn có thể cần shlexcho godoc.org/github.com/google/shlex
akhy

8

Nếu bạn đang sử dụng mẹo: regexp.Split

func (re *Regexp) Split(s string, n int) []string

Chia các lát s thành các chuỗi con được phân tách bằng biểu thức và trả về một lát của các chuỗi con giữa các kết quả phù hợp đó.

Slice được trả về bởi phương thức này bao gồm tất cả các chuỗi con của s không có trong slice được trả về bởi FindAllString. Khi được gọi trên một biểu thức không chứa siêu ký tự, nó tương đương với string.SplitN.

Thí dụ:

s := regexp.MustCompile("a*").Split("abaabaccadaaae", 5)
// s: ["", "b", "b", "c", "cadaaae"]

Số đếm xác định số chuỗi con trả về:

n > 0: at most n substrings; the last substring will be the unsplit remainder.
n == 0: the result is nil (zero substrings)
n < 0: all substrings

3
điều này có vẻ như là quá mức cần thiết
thwd

@Tom Nhưng nó vẫn thú vị ngay cả khi nó không phải là câu trả lời tốt nhất ở đây. Tôi đã ủng hộ câu trả lời này vì tôi đã học được điều gì đó.
Denys Séguret

Bạn nên lưu ý rằng nó Fields()sẽ không trả về các chuỗi trống. Vì vậy, số lượng trường trả về sẽ khác nhau. Nếu bạn đang cố gắng phân tích cú pháp một cái gì đó nhất quán, thì nó sẽ không hiệu quả với bạn. Bạn có thể cần phải sử dụng regex nếu một FieldsFunc()cũng không hoạt động.
Tom

3

Tôi đã nghĩ ra những điều sau, nhưng điều đó có vẻ hơi dài dòng:

import "regexp"
r := regexp.MustCompile("[^\\s]+")
r.FindAllString("  word1   word2 word3   word4  ", -1)

sẽ đánh giá:

[]string{"word1", "word2", "word3", "word4"}

Có một cách diễn đạt thành ngữ ngắn gọn hơn hoặc nhiều hơn?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.