0

まず、正規表現に関する私の知識はそれほど大きくありません。個人的には、ハリー・ポッターの本のヴォルデモートと比較しています。

正規表現を使用して、かなり大きな文字列をチャンクに分割しようとしています。

文字列は次のようなものです(見たいかもしれません):

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 %}

したがって、この文字列はデータベースに保存されたメールであり、その後 Liquid タグを使用して解析されます。

Liquid は魅力的な言語です。次のような変数の概念と、次のよう{{ 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 }}{% ifendif %}

私はその方法が大好きですmax_by:D

これで、各オプションが個別に機能します。しかし、それらがすべて一緒になると、それらは機能しないようです。何が起こっているのかわかりません。分割が進むにつれて分割されているため、正規表現の if/end 部分が実行されていないのではないかと疑っています。

だから私の質問は

正規表現の何が問題になっていますか?

分割は正規表現でどのように機能しますか?

私はこれを正しい方法で行っていますか?

ありがとう、

ディッキー

4

1 に答える 1