Regex 正则表达式匹配一个单词,后跟一个事物的变体

Regex 正则表达式匹配一个单词,后跟一个事物的变体,regex,Regex,我一直在努力在Postgres中编写一些正则表达式,以过滤掉字符串中的一些垃圾。以下是我遇到的各种情况: AUTO PARTS STORE 15 AUTO PARTS STORE #15 AUTO PARTS STORE #A15 AUTO PARTS STORE #AB15 AUTO PARTS STORE #A 15 AUTO PARTS STORE #A A15 AUTO PARTS STORE #15A AUTO PARTS STORE #15-15 #后面的数字可以是一个或多个。此外

我一直在努力在Postgres中编写一些正则表达式,以过滤掉字符串中的一些垃圾。以下是我遇到的各种情况:

AUTO PARTS STORE 15
AUTO PARTS STORE #15
AUTO PARTS STORE #A15
AUTO PARTS STORE #AB15
AUTO PARTS STORE #A 15
AUTO PARTS STORE #A A15
AUTO PARTS STORE #15A
AUTO PARTS STORE #15-15
#后面的数字可以是一个或多个。此外,“STORE”和“#”之间不能有空格

我试图过滤的是“存储”和之后的任何存储编号,无论其格式如何

到目前为止,我已经开发了以下内容:

select regexp_replace(estab_name,E'STORE (#)?( )?([A-Z])?([A-Z])?( )?\\d+\\Z',' ')
以下是我遗漏的一些案例的示例,以及我想返回的内容(注意——这是一个基于评论的第三方编辑,以向OP展示我认为他的意思;并请更正):


任何帮助都将不胜感激。我对编写复杂的正则表达式非常陌生,这正在扼杀我的大脑。

从下面的示例中可以看出,您肯定是在追求:

 STORE ?:? ?#?[A-Z0-9 -]+$

将\b用于单词边界

 \bSTORE.*

如果我对你所问问题的解释是正确的,那么你试图匹配的是“单词‘STORE’之后的所有内容,直到字符串结束”。在这种情况下,您的正则表达式

STORE.*$
你可以在网站上看到这一点。如果我的解释是向后的,并且您希望匹配“单词
存储
之前的所有内容”,那么您的正则表达式是

^.*(?=STORE)
使用“向前看”来表示“直到你右边的字符是“存储”为止的所有内容”。你可以在


如果您在“存储”之前需要空间“为了消除这些问题,我相信您可以找到如何更改表达式的方法。

能否显示您期望的输出结果?例如,对于
7-ELEVEN商店#2301-14410N
,是否希望
STORE#2301
STORE 2301
STORE 2301-14410
,…?确保没有问题。我希望删除任何存储和号码信息。因此,从上面的例子来看:7-ELEVEN食品店#11150A 7-ELEVEN食品店#20132C 7-ELEVEN食品店#2306-2134 7-ELEVEN食品店#2301-14410N 7-ELEVEN食品店#14279B TODD BAXTER 7-ELEVEN 84木材公司,LP,商店:#0922 84木材公司,LP,大地段商店#1886大地段KROGER商店J-978 KROGER抱歉,我在添加换行符时遇到问题。如果编辑您的答案,很容易使换行符出现。我已经用我相信你所问的内容编辑了你的问题-请确认这是正确的。“filter”的意思可能是“keep”或“remove”……从技术上讲,破折号应该放在字符集的前面,否则它应该在两个字符之间。@Raceimaztion不是这样的。字面上的破折号可以是first,也可以是last,真的吗?我很久以前就读到了相反的内容,从那以后我就一直坚持这样做——有什么特别的原因吗?因为没有任何错误似乎是由它们在最后产生的?尽管如此,我还是很乐意改变它,如果这实际上是一种糟糕的做法,不管出于什么原因,我已经遇到了一些正则表达式实现,它们会为尾随破折号提供错误。
^.*(?=STORE)