Oracle11g Regex Группы без захвата

Мультивалютный REGEXP_SUBSTR Oracle11g

Впервые выкладываю вопрос здесь, так что я надеюсь, что я не испортил его слишком сильно.

Я создал запрос, который извлекает различные детали заказа клиента, включая цену, указанную в прайс-листе и большую цену, которая была отправлена ​​клиентам по электронной почте с напоминанием.

Используя REGEXP_SUBSTR, я могу сопоставить все цены из содержимого HTML сообщений в разных валютах, но я столкнулся с проблемой, связанной с выводом для определенных комбинаций аббревиатур валют в ценах, в которых отсутствуют запятые или точки: т.е. 123 крон, 999 песо или 1 050 крон

Как сделать так, чтобы этот сценарий соответствовал выходным данным других форматов цен?

Я извлек большую часть своего "вдохновения" из ответа Гэри здесь: проверка валюты Regex.

Источник данных HTML

Желаемые значения, начиная с <!-- START Price Exp.. -->:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

            <title>Thank you for using us</title>
            <style type="text/css">
                .ReadMsgBody {
                    width: 100%;
                }
                .ExternalClass {
                    width: 100%;
                }
                BODY {
                    font-family: OpenSans, Arial, Helvetica, sans-serif;
                    font-size:13px;
                    color:#555555;

                }
                TD {
                    font-family: OpenSans, Arial, Helvetica, sans-serif;
                    font-size:13px;
                    color:#555555;
                    vertical-align: top;
                }
                A {
                    color: #f48024;

                }
                IMG {
                    display:block;
                    border: none;
                }
                H1 {
                    font-size: 18pt;

                }
                H2 {
                    font-size: 15pt; 
                }
                H1, H2, H3, P, UL, LI {
                    margin: 0;
                    padding: 0;
                }                  
            </style>
        </head>

        <body style="margin: 0; padding: 0; background-color: #eeeeee" bgcolor="#eeeeee">

            <table width="100%"  border="0" cellpadding="0" cellspacing="0" style="margin: 0; padding: 0; ">
                <tbody>
                    <tr>
                        <td align="center" width="100%" >

                     <!-- TOP-->
                            <table bgcolor="#eeeeee" border="0" cellpadding="0" cellspacing="0" style="background-color: #eeeeee; width:100%; max-width:900px; ">                           
                                <tbody>

                                    <tr>
                                        <td height="34" style="font-size: 1px;"><!-- cell --></td>
                                    </tr>
                                </tbody>
                            </table>
                            <!-- END TOP-->

                            <!-- LOGO -->
                            <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#fff" style="width:100%;  background-color: #fff; max-width:900px;">
                                <tr>
                                    <td>
                                        <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#fff" style="background-color: #fff; text-align: center; max-width:650px;">

                                            <tr>
                                                <td align="center" height="40" bgcolor="#fff" style="background-color: #fff; vertical-align: middle; text-align: center; ">
                                                    <a href="https://www.company.com/" target="_blank"><img align="center" style="" src="https://cdn.sstatic.net/Sites/stackru/img/apple-touch-icon@2.png?v=73d79a89bded" style="display:block" alt="" /></a>
                                                </td>
                                            </tr>

                                        </table>
                                    </td>
                                </tr>
                            </table>
                            <!-- END LOGO-->

                           <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#fff" style="width:100%; max-width:900px; background-color: #fff;">

                                <tr>
                                    <td>

                                        <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#fff" style="width:100%;  background-color: #fff; max-width:800px; padding-left:10px; padding-right:10px;">     
                                            <tr>
                                                <td height="30" style="font-size: 1px;"><!-- cell --></td>
                                            </tr> 

                                            <tr>
                                                <td>
                                                    <p style="text-align: center; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:22px; color:#41424e; line-height: 1.4"><b>Example Template</b></p>
                                                </td>
                                            </tr>

                                            <tr>
                                                <td height="34" style="font-size: 1px;"><!-- cell --></td>
                                            </tr> 

                                            <tr>
                                                <td>
                                                    <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#767683; line-height: 1.4">Dear customername,</p>
                                                </td>
                                            </tr>
                                             <tr>
                                                <td height="20" style="font-size: 1px;"><!-- cell --></td>
                                            </tr> 

                                            <tr>
                                                <td>
                                                    <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#767683; line-height: 1.4">Your productname - 1PC has been successfully renewed.</p>
                                                </td>
                                            </tr>

                                            <tr>
                                                <td height="20" style="font-size: 1px;"><!-- cell --></td>
                                            </tr>

                                            <tr>
                                                <td>
                                                    <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#767683; line-height: 1.4">Details of your sub below.</p>
                                                </td>
                                            </tr>

                                            <tr>
                                                <td height="40" style="font-size: 1px;"><!-- cell --></td>
                                            </tr>
                                        </table>
                                    </td>  
                                </tr>         
                            </table>  

                            <!-- sum-->
                            <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#F2F2F6" style="width:100%;  background-color: #F2F2F6; max-width:900px;">     
                                <tr>
                                    <td>
                                        <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#F2F2F6" style="width:100%;  background-color: #F2F2F6; max-width:800px; padding-left:10px; padding-right:10px;">     
                                            <tr>
                                                <td height="34" style="font-size: 1px;"><!-- cell --></td>
                                            </tr> 

                                                <tr>
                                                    <td>
                                                        <p style="text-align: center; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:20px; color:#41424e; line-height: 1.4"><b>Your Auto-Renewal Sub</b></p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td height="20" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 

                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#42ba8f; line-height: 1.4"><b>Product</b></p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td height="1" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4">Productname - 1 PC</p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td height="20" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#42ba8f; line-height: 1.4"><b>Order ID</b></p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td height="1" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4">12131415161</p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td height="20" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#42ba8f; line-height: 1.4"><b>Exp Prices charged</b></p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td height="1" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                            <!--START Price Exp, templates could be in numerous different languages but info like i.e. customername, productname, Order ID, Tracking IDs will always use the same format. --> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4">$69.99 (a tax message)</p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td height="1" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4">123 kr (b tax message)</p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td height="1" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4">999 Pesos (c tax message)</p>
                                                    </td>
                                                </tr>
                                    <!--END Price Exps -->
                                               <tr>
                                                    <td height="20" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#42ba8f; line-height: 1.4"><b>Automatically renewed</b></p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td height="1" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4">May 20, 2018</p>
                                                    </td>
                                                </tr>
                                            <tr>
                                                <td height="42" style="font-size: 1px;"><!-- cell --></td>
                                            </tr>
                                        </table>   
                                    </td>
                                </tr>
                            </table>
                            <!--END sum -->  

                            <!-- white-->
                            <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#fff" style="width:100%; max-width:900px; background-color: #fff;">
                                <tr>
                                    <td height="15" style="font-size: 1px;"><!-- cell --></td>
                                </tr>

                                <tr>
                                    <td>

                                        <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#fff" style="width:100%;  background-color: #fff; max-width:800px; padding-left:10px; padding-right:10px;">     
                                            <tr>
                                                <td height="30" style="font-size: 1px;"><!-- cell --></td>
                                            </tr> 
                                            <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4">If you’d like to check your order status, please sign in to <a href="https://www.company.com/en-us/order?pgm=6916670010" target="_blank">company.com/orders</a> with the login credentials below.</p>
                                                    </td>
                                                </tr>
                                               <tr>
                                                    <td height="20" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4"><b>Order ID:</b> 12131415161</p>
                                                    </td>
                                                </tr>
                                            <tr>
                                                    <td height="1" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4"><b>Password:</b> stAcKoverFlOwrocks</p>
                                                    </td>
                                                </tr>
                                            <tr>
                                                    <td height="20" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#42ba8f; line-height: 1.4"><b>Your Plan</b></p>
                                                    </td>
                                                </tr>
                                            <tr>
                                                    <td height="1" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                                <tr>
                                                    <td>
                                                        <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4"><strong>Auto-Renewal Terms</strong><p>By completing your purchase, you have authorized us to do a bunch of legal stuff.</p>
                                                    </td>
                                                </tr>
    <tr>
                                                    <td height="30" style="font-size: 1px;"><!-- cell --></td>
                                                </tr> 
                                            <tr>
                                                <td>
                                                    <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4"><b>Need help?</b></p>
                                                </td>
                                            </tr>
                                            <tr>
                                                <td height="1" style="font-size: 1px;"><!-- cell --></td>
                                            </tr> 
    <tr>                                                                                      
                                                <td  style="vertical-align: middle;">                                               
                                                    <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4"><a href="https://company.com/en_US/support" target="_blank">company.com/help</a></p>
                                                </td>
                                            </tr>
                                            <tr>
                                                <td height="30" style="font-size: 1px;"><!-- cell --></td>
                                            </tr> 
                                            <tr>
                                                <td>
                                                    <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:16px; color:#41424e; line-height: 1.4">Thanks for trusting us.</p>
                                                </td>
                                            </tr>


                                            <tr>
                                                <td height="34" style="font-size: 1px;"><!-- cell --></td>
                                            </tr> 
                                        </table>
                                    </td>
                                </tr>
                            </table>
                            <!-- END white -->
                            <!--FOOTER-->
                            <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#777684" style="width:100%;  background-color: #E7E7EF; max-width:900px;">     
                                <tr>
                                    <td height="30" style="font-size: 1px;"><!-- cell --></td>
                                </tr> 
                                <tr>
                                    <td>
                                        <table align="center" cellspacing="0" cellpadding="0" border="0" bgcolor="#777684" style="width:100%;  background-color: #E7E7EF; max-width:900px;">
                                <tr>
                                   <td>
                                        <table><tr><td>
                                                    <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:14px; color:#767683; line-height: 1.4">Trouble installing? <u><a href="https://www.company.com/en-us/faq.php" target="_blank">Visit FAQ</a></u></p>
                                                    <p style="text-align: left; margin:0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size:14px; color:#767683; line-height: 1.4">Curious for more? <u><a href="https://www.company.com/en-us" target="_blank">Find more</a></u></p>
                                                </td></tr></table>
                                    </td>
                                    <td>
                                        <table align="right" >
                                            </tr> </table> 
                                    </td>
                                </tr>
                                <tr>
                                    <td height="30" style="font-size: 1px;"><!-- cell --></td>
                                </tr>
                                        </table>
                                    </td>
                                </tr>
                            </table>           
                            <!--END FOOTER -->  
                        </td>
                    </tr>
                </tbody> 
            </table>
        </body>
    </html>

REGEX

(NT\$|SAR)\s(\d{2,5})|\d{1,4}([.,]\d{3})*([\s.,]\d{2,3}|[^\W]\d+(\d{1,4})*\s(kr|zł|Pesos|Kč|Ft|บาท|SAR|₪))

Совпадает все

  • 1,4">$19,99 (немного случайного текста)
  • 1,4">R$20,00
  • 1.4" > 20.00 €
  • 1,4" > € 25,99
  • 1.4" > £ 15.99
  • 1,4 ">123 кр
  • 1,4 ">1234 футов
  • 1,4 ">999 песо

Выход

  • 19,99
  • 20,00
  • 20,00
  • 25,99
  • 15,99
  • 123 кр
  • 1234 футов
  • 999 песо

В последних трех примерах не должно быть пробела и / или каких-либо букв после цифр.

Как я могу удалить их из вывода, но сохранить номера?


Я понимаю, что это вероятно из-за нескольких групп захвата, которые у меня есть, поэтому я вижу три потенциальных решения:

  1. Уточните Regex, чтобы исключить чрезмерное использование групп (я не достаточно квалифицирован, чтобы понять это)...
  2. Каким-то образом написать Regex non-captureing groups, которые приводят к желаемому результату. Я с грустью узнал, что (?:) просто не работает.
  3. Используйте параметры функции SQL для выбора подвыражений из REGEXP_SUBSTR. Тем не менее, это не позволяет использовать более одного подвыражения в выводе.

SQL

SELECT
REPLACE(REPLACE(REGEXP_SUBSTR(nnc.MESSAGE, '(NT\$|SAR)\s(\d{2,5})|\d{1,4}([.,]\d{3})*([\s.,]\d{2,3}|[^\W]\d+(\d{1,4})*\s(kr|zł|Pesos|Kč|Ft|บาท|SAR|₪))'),',','.'),' ','') AS EMAIL_PRICE_SENT
FROM tablename
WHERE clause;

Это полный оператор с парой вложенных функций REPLACE для форматирования вывода в системный формат.

  • Смотрите Regex в действии здесь: Regex 101 Link.

Я знаю, что это неправильный язык, поэтому он не будет обеспечивать 100% точный тест, но я считаю его очень полезным, прежде чем запускать его с БД. Я всегда открыт для лучших предложений инструмента!

Я потратил слишком много времени, чем горжусь этим, поэтому любая помощь будет высоко ценится.

Спасибо ник

0 ответов

Другие вопросы по тегам