Yêu cầu thg 12 26, 2018 6:41 SA 191 2 2
  • 191 2 2
+1

Hỏi về regex

Chia sẻ
  • 191 2 2

E đang có 1 một expression và regex như sau:

expression = "ROUND(SUM(F9:I9)/2,0)"
elements = expression.scan /[A-Z]+(?:\()[\(\)\w+\+\-\*\/\d+<=>\.\,\:\$%]+\)|[\w+\+\-\*\/\d+<=>\.\:\$%]+/

E muốn elements là split của expression với kết quả là:

["ROUND", "(", "SUM", "(", "F9", ":", "I9", ")", "/", "2,0", ")"]

Nhưng như trên đang ra empty, có anh chị nào pro regex chỉ giúp e với ạ. Thanks!

thg 12 26, 2018 6:43 SA

Bạn đang dùng ngôn ngữ lập trình nào vậy?

Avatar Nam @Black.Box
thg 12 26, 2018 6:48 SA

@huukimit Mình dùng Ruby bạn à

thg 12 26, 2018 6:50 SA

@Black.Box Mình tưởng bạn dùng javascript thì làm như sau sẽ ra kết quả như mong muốn:

const a = 'ROUND(SUM(F9:I9)/2,0)'
const result = a.split(/(\(|\)|\:|\/)/)

console.log(result)
thg 12 26, 2018 6:52 SA

@Black.Box Mình thấy string trong Ruby cũng có hàm split như trên javascript, bạn thử dùng cách của mình ở trên xem sao?

2 CÂU TRẢ LỜI


Đã trả lời thg 12 26, 2018 6:54 SA
+3

Mình thấy string trong Ruby cũng có hàm split như trên javascript, bạn thử dùng cách của mình ở trên xem sao?

expression = "ROUND(SUM(F9:I9)/2,0)"
elements = expression.split(/(\(|\)|\:|\/)/)
Chia sẻ
Đã trả lời thg 12 26, 2018 6:59 SA
+3
text = "ROUND(SUM(F9:I9)/2,0)"
elements = text.scan /\d+[,.]?\d+|\w+|\W/

Kết quả:

=> ["ROUND", "(", "SUM", "(", "F9", ":", "I9", ")", "/", "2,0", ")"]

Trong đó, mình định nghĩa text đầu vào của bạn thành 3 loại:

  • Số thực: \d+[,.]?\d+ (ví dụ 2.2 hoặc 2,22)
  • chữ và số liền nhau: \w+
  • phần còn lại: \W
Chia sẻ
Avatar Nam @Black.Box
thg 12 26, 2018 8:16 SA

Regex này có áp dụng cho cái expression động k anh?

thg 12 26, 2018 8:20 SA

@Black.Box là sao bạn nhỉ?

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí