用户可以通过多种方式输入“邮局信箱”的首字母缩写,如P.O.box、PO等。
邮箱后面总是有号码的。
我试图获得匹配的所有可能的方式,用户可以输入一个字符串。有时用户会在PO之前输入一些内容,如果字符串看起来与PO相关,我只需要匹配。
寻找与下面的1-6匹配但与7-10不匹配的表达式。
G.P.O.box=邮政总局信箱,而我正在努力避免与之匹配。我认为表达式必须允许空白或没有其他字符之前的'P‘。
我想出了下面的内容,但它不是跳过GPO盒,也不是跳过PPO盒之类的奇怪的东西。
P{1}\s?\.?O{1}\.?\s+(BOX)\s+[0-9]*任何帮助都将不胜感激。谢谢!
发布于 2020-01-24 07:41:12
您可以使用负查找后面的(?<!G\.?)P (P前面没有G\.?):
WITH T (ID, STR) AS
(
VALUES
( 1, 'PO BOX 123')
, ( 2, 'P.O BOX 655')
, ( 3, 'P.O. BOX 155')
, ( 4, 'PO BOX 1')
, ( 5, 'P O BOX 123')
, ( 6, 'blahblah PO BOX 123')
, ( 7, 'GPO BOX 123')
, ( 8, 'blah G P O BOX 111')
, ( 9, 'P O B OX')
, (10, 'PP.O BOX 122')
, (11, 'G.P.O BOX 122')
)
SELECT T.*
, REGEXP_LIKE(STR, '(?<!G\.?)P\s?\.?O\.?\s+BOX\s+[0-9]*') FLAG
FROM T
|ID |STR |FLAG |
|-----------|-------------------|-----|
|1 |PO BOX 123 |true |
|2 |P.O BOX 655 |true |
|3 |P.O. BOX 155 |true |
|4 |PO BOX 1 |true |
|5 |P O BOX 123 |true |
|6 |blahblah PO BOX 123|true |
|7 |GPO BOX 123 |false|
|8 |blah G P O BOX 111 |true |
|9 |P O B OX |false|
|10 |PP.O BOX 122 |true |
|11 |G.P.O BOX 122 |false|发布于 2020-01-24 01:50:06
像这样的怎么样?
'^\s*P[. ]*O[. ]*Box\s*[0-6]$'https://stackoverflow.com/questions/59889399
复制相似问题