簡體   English   中英

Ruby正則表達式拆分字符串

[英]Ruby regex split string

首先,我對正則表達式的了解不是很好。 我個人將它們與《哈利·波特》書中的伏地魔進行了比較。

我試圖使用正則表達式將相當大的字符串分成多個塊。

該字符串類似於(您可能希望看到它):

Hi {{company_name}}\r\n\r\nA new order has been created via your website, from a customer with the following details:\r\n\r\n<table border=\"1\">\r\n  <tr>\r\n    <td>Full Name</td>\r\n    <td>{{ customer.full_name }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Email</td>\r\n    <td>{{ customer.email }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Mobile</td>\r\n    <td>{{ customer.mobile }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Landline</td>\r\n    <td>{{ customer.landline }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Notes</td>\r\n    <td>{{ notes }}</td>\r\n  </tr>\r\n</table>\r\n\r\nThese products or services were ordered:\r\n\r\n{% if appointment_items != empty %}\r\nBooking Details\r\n<table border=\"1\">\r\n  <tr>\r\n   <td>Type</td>\r\n   <td>Description</td>\r\n   <td>Price</td>\r\n</tr>\r\n{% for line_item in appointment_items %}\r\n<tr>\r\n  <td>{{ line_item.category }}</td>\r\n  <td>{{ line_item.short_description}}</td>\r\n  <td>{{ line_item.price | display_price }}</td>\r\n</tr>\r\n{% endfor %}\r\n</table>\r\n{% endif %}\r\n\r\n{% if enquiry_items != empty %}\r\nEnquiry Details\r\n<table border=\"1\">\r\n  <tr>\r\n   <td>Type</td>\r\n   <td>Description</td>\r\n   <td>Price</td>\r\n</tr>\r\n{% for line_item in enquiry_items %}\r\n<tr>\r\n  <td>{{ line_item.category }}</td>\r\n  <td>{{ line_item.short_description}}</td>\r\n  <td>{{ line_item.price | display_price }}</td>\r\n</tr>\r\n{% endfor %}\r\n</table>\r\n{% endif %}\r\n\r\n{% if has_appointment %}\r\n\r\nOne or more of the order items requires an engineer appointment. This appointment has been allocated to an engineer and given a provisional appointment time.\r\n\r\n<table border=\"1\">\r\n  <tr>\r\n    <td>Start</td>\r\n    <td>{{ appointment.start | date_with_time_zone: \"%A %d %b %Y at %H:%M %P\"  }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Finish</td>\r\n    <td>{{ appointment.finish | date_with_time_zone: \"%A %d %b %Y at %H:%M %P\"  }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Duration</td>\r\n    <td>{{ appointment.duration }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Engineer Name</td>\r\n    <td>{{ appointment.engineer }}</td>\r\n  </tr>\r\n</table>\r\n\r\nThe address of the appointment is:\r\n\r\n<table border=\"1\">\r\n  <tr>\r\n    <td>Address Line 1</td>\r\n    <td>{{ appointment.address.line_one }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Address Line 2</td>\r\n    <td>{{ appointment.address.line_two }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Town/City</td>\r\n    <td>{{ appointment.address.town_city }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>County</td>\r\n    <td>{{ appointment.address.county }}</td>\r\n  </tr>\r\n  <tr>\r\n    <td>Postcode</td>\r\n    <td>{{ appointment.address.postcode }}</td>\r\n  </tr>\r\n</table>\{% endif %}

因此,此字符串是一封電子郵件,存儲在數據庫中,然后使用液體標簽進行解析。

液體是一種誘人的語言。 它具有變量的概念,例如: {{ var_name }}和邏輯,例如if語句,例如: {% if var_name == true %} //do something {% endif %}

發送電子郵件時,我需要能夠獲得此電子郵件中最長的字符串,即100%。 我的最終目標是編寫一個測試,以檢查電子郵件正文中最長的字符串。

我想出了這個:

regex = /{{.*?}}|\\\n|\\\r|({%\s?if).*(endif\s?%})/

mail_template_content_part = @mail_template.content.split(regex).reject(&:empty?).map(&:strip).max_by(&:length)

正則表達式應該在液體變量{{ my_var }}新行上進行分割,並在{% if和一切直到結束endif %}的開頭處進行分割

我喜歡max_by方法:D

現在,每個選項都可以單獨工作。 但是,當所有這些放在一起時,它們似乎不起作用。 我不確定發生了什么,我懷疑拆分正在拆分,因此正則表達式的if / end部分未運行。

所以我的問題是

正則表達式有什么問題?

正則表達式如何拆分?

我要這樣做正確嗎?

謝謝,

迪基

嗯,使用正則表達式解析語言只是一個拐杖。

Liquid本身使用大量的正則表達式。 他們最近將其更改為使用真正的解析器。

我當時想,使用自定義Liquid標簽或自定義HTML標簽,id或類來注釋應該放入電子郵件中的部分可能是一個更好的主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM