需要在文本字段中找到带标签的数字 - 正则表达式后视不起作用
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>
语法提取捕获组的值。
我认为这抓住了你在组中需要的东西:
((\b\d+)(?:\sPI?N ?#? ?))|((?:PI?N ?#? ?)(\d+))
我们正在将遗留数据转换为新系统。用户要求我们从旧系统的文本评论字段中提取 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>
语法提取捕获组的值。
我认为这抓住了你在组中需要的东西:
((\b\d+)(?:\sPI?N ?#? ?))|((?:PI?N ?#? ?)(\d+))