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

Need to find a labeled number in a text field - regular expression lookbehind won't work

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

PIN 码由文本 "PIN" 或 "PN" 表示,有或没有井号,中间有不同数量的白色 space。 PIN 周围可以有任意数量的字母或数字。有时数字出现在文本之前 (9999 PIN)。

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

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

这里有一些源数据的例子。我只想要粗体数字。
9999XX00999X 密码#999999
9999XX000999 - PIN#909999
XXXXX XX PIN #9099999
9999XX99X 密码999099
99XX999X 编号 9999999
9999999 密码
90PA999 产品编号 999999
999009 PIN#
99PA99 编号#9999999
密码 999990
XXXPIN990999
密码#999099
密码# 9990909
密码#9099999*

您可以使用 REGEXP_REPLACE,像这样:

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

想法是匹配从 ^$ 的整个字符串,但只将 pin 部分放入 捕获组 括号中。之后使用 </code> 和 <code> 语法提取捕获组的值。

Demo.

我认为这抓住了你在组中需要的东西:

((\b\d+)(?:\sPI?N ?#? ?))|((?:PI?N ?#? ?)(\d+))

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