it-swarm-vi.tech

Phù hợp với tất cả các lần xuất hiện của biểu thức chính quy

Có cách nào nhanh chóng để tìm mọi kết quả của biểu thức chính quy trong Ruby không? Tôi đã xem qua đối tượng Regex trong Ruby STL và tìm kiếm trên Google nhưng không có kết quả.

558
Chris Bunch

Sử dụng scanNAME _ nên thực hiện thủ thuật:

string.scan(/regex/)
787
Jean

Để tìm tất cả các chuỗi khớp, sử dụng scanNAME _ phương thức của lớp Stringname__.

str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]

Nếu bạn muốn MatchDataNAME _ là loại đối tượng được trả về bởi, phương thức matchcủa RegexpNAME _ các lớp

str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]

Lợi ích của việc có MatchDatalà bạn có thể sử dụng các phương thức như offsetname__

match_datas = str.to_enum(:scan, /\d+/).map { Regexp.last_match }
match_datas[0].offset(0)
#=> [2, 4]
match_datas[1].offset(0)
#=> [7, 8]

Tham khảo những câu hỏi này nếu bạn muốn biết thêm
[.__.] Làm cách nào để có được dữ liệu khớp cho tất cả các lần xuất hiện của biểu thức chính quy Ruby trong chuỗi?
[.__.] Trình liệt kê khớp biểu thức chính quy của Ruby với hỗ trợ chụp có tên
[.__.] Cách tìm ra điểm bắt đầu cho mỗi trận đấu trong Ruby

Đọc về các biến đặc biệt $&, $', $1, $2 trong Ruby sẽ rất hữu ích.

57
sudo bangbang

nếu bạn có một biểu thức chính quy với các nhóm:

str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/

Bạn sử dụng quét phương thức chuỗi để tìm các nhóm khớp:

str.scan re
#> [["54"], ["1"], ["3"]]

Để tìm mẫu phù hợp:

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]
11
MVP