需要在文本字段中找到带标签的数字 - 正则表达式lookbehind不起作用

时间:2015-07-02 13:09:01

标签: regex oracle11g keyword substr lookbehind

我们正在将旧数据转换为新系统。用户要求我们从旧系统的文本注释字段中提取PIN码,并将其放在新系统中的自己的字段中。

PIN码由文本“PIN”或“PN”表示,带或不带井号,其间有不同数量的空白区域。 PIN周围可以有任意数量的字母或数字。有时这个数字出现在文本之前(9999 PIN)。

我希望使用正则表达式,从这样开始:(?< = PIN)\ d {0,20}。当我将它放入正则表达式测试器时,它可以工作并从'123PIN456'中拉出'456'。但是我们使用的是Oracle PL / SQL,它不支持lookbehind功能。

此时我正在考虑使用substr,replace或其他Oracle函数,并编写单独的行来处理每个可能的排列。我希望有更好,更快,更有效的方式。

以下是源数据的一些示例。我只想要粗体数字。
9999XX00999X PIN# 999999
9999XX000999 - PIN# 909999
XXXXX XX PIN# 9099999
9999XX99X密码 999099
99XX999X PN 9999999
9999999 PIN
90PA999 PN 999999
999009 PIN#
99PA99 PN# 9999999
PIN 999990
XXXPIN的 990999
PIN#的 999099
密码# 9990909
PIN# 9099999 *

2 个答案:

答案 0 :(得分:1)

您可以使用REGEXP_REPLACE,如下所示:

select REGEXP_REPLACE(s, '^.*?PI?N ?#? ?(\d{1,20}).*$|^.*?(\d{1,20}) ?PI?N.*$', '\1\2')
from test;

我们的想法是匹配从^$的整个字符串,但只将引脚部分放入捕获组括号中。之后,使用\1\2语法提取捕获组的值。

Demo.

答案 1 :(得分:0)

我认为这可以捕捉到群体中你需要的东西:

.then(function (listaUsuarios){
       var argsVisit;


      if (tipoVisita == 'N'){
            argsVisit = {'user' : { "$in" :listaUsuarios }, 'tipo' : { "$in" : ["2001","2002"] }, "createdAt": {"$gte": dataInicial, "$lt": dataFinal }};
        } else if (tipoVisita == 'R'){
            argsVisit = {'user' : { "$in" :listaUsuarios }, 'tipo' : { "$in" : ["2005"] }, "createdAt": {"$gte": dataInicial, "$lt": dataFinal }};
        } else if (tipoVisita == 'I'){
            argsVisit = {'user' : { "$in" :listaUsuarios }, 'tipo' : { "$in" : ["2003"] }, "createdAt": {"$gte": dataInicial, "$lt": dataFinal }};
        }

        var initDate = new Date('2015-04-02T00:00:00.000Z');
        var endDate = new Date('2015-05-09T00:00:00.000Z');

       argsMatch = [{ $match : { "createdAt" : { $gte: initDate, $lt: endDate  }} },
                   { $group : { _id : { "usuario" : listaUsuarios , "dia" : { $dayOfMonth : "$createdAt" } },  "visitas" : {$sum : { $cond: [ {$or : [ { $eq: [ "$tipo", "2001"] },{ $eq: [ "$tipo","2002"] }] },1,0 ]}}}
                    }]

      Visita.aggregate(argsMatch)
        .exec(function (err, results) {
                if (err) {
                    console.log("Erro!!!");
                    deferredDados.reject({
                        error: 500,
                        message: 'Erro buscando Visita, erro: '+err
                    });
                } else {
                    if (!results || results.length == 0) {
                        console.log("Sem retorno!!!");
                        deferredDados.resolve( [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ); //Tudo zerado poruqe não há retorno.
                        //deferredDados.resolve(0);

                        deferredDados.reject({
                            error: 500,
                            message: 'Erro buscando Visitas, não achou resultados'

                        });
                    } else {
                        deferredDados.resolve( results );
                    }

                }

            });
      return deferredDados.promise;       
  })
  .then(function(dados) {
        res.json(dados);

    })
   .catch(function(fallback) {
    console.log('Erro no retorno dos usuarios!!!');
    console.log(fallback);
  }); 

演示:https://regex101.com/r/aQ9uM7/1