我们正在将旧数据转换为新系统。用户要求我们从旧系统的文本注释字段中提取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 *
答案 0 :(得分:1)
您可以使用REGEXP_REPLACE
,如下所示:
select REGEXP_REPLACE(s, '^.*?PI?N ?#? ?(\d{1,20}).*$|^.*?(\d{1,20}) ?PI?N.*$', '\1\2')
from test;
我们的想法是匹配从^
到$
的整个字符串,但只将引脚部分放入捕获组括号中。之后,使用\1
和\2
语法提取捕获组的值。
答案 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);
});