Asked Dec 26th, 2018 6:41 AM 139 2 2
  • 139 2 2
+1

Hỏi về regex

Share
  • 139 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!

Dec 26th, 2018 6:43 AM

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

0
| Reply
Share
Nam @Black.Box
Dec 26th, 2018 6:48 AM

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

0
| Reply
Share
Dec 26th, 2018 6:50 AM

@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)
0
| Reply
Share
Dec 26th, 2018 6:52 AM

@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?

0
| Reply
Share

2 ANSWERS


Answered Dec 26th, 2018 6:54 AM
+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(/(\(|\)|\:|\/)/)
Share
Answered Dec 26th, 2018 6:59 AM
+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
Share
Nam @Black.Box
Dec 26th, 2018 8:16 AM

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

0
| Reply
Share
Dec 26th, 2018 8:20 AM

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

0
| Reply
Share