我正在尝试创建一个正则表达式,它将捕获字符串中的所有内容,但字符串的特定部分除外。他最好的起点似乎是使用小组。
例如,我想从字符串中捕获除“production”和“public”之外的所有内容。 样本输入:
位于加州的公共本地卡生产
生产内华达公开
会提供输出
加利福尼亚本地卡
内华达
在https://regex101.com/上我可以用
提取我不想要的字符串with q as (
<your query here>
)
select q.*
from (select q.*,
row_number() over (order by seller desc) as seqnum_s,
row_number() over (order by purchaser desc) as seqnum_p
from q
) q
where seqnum_s = 1 or seqnum_p = 1;
但是如何捕捉我想要的东西呢? 以下内容将让我从生产和公开之间得到这个词,但不是https://regex101.com/r/f5xLLr/2之前或之后的任何内容:
(production|public)\g
翻转并转到\ s \ S实际上在两个不同的子组中给出了我需要的东西(两个匹配中的group2)https://regex101.com/r/ItlXk5/1:
(production|public)-?(\w*)\g
但如何结合结果呢?理想情况下,我想将它们作为一个单独的命名组提取,这是我已经到达https://regex101.com/r/scWxh5/1的地方:
(([\s\S]*?)(production|public))\g
但这打破了group2的匹配并让我得到空字符串。我还应该尝试什么?
编辑:这个问题归结为:How to merge regex group matches? 这似乎是在正则表达式中无法解决的。
答案 0 :(得分:1)
正则表达式匹配始终是示例字符串的连续范围。因此,anwswer是&#34;不,你不能写一个匹配一系列连接子串的正则表达式,如问题&#34;中描述的那样。
但是,通过用空字符串替换不必要的单词,这种流行的任务很容易解决。像
s/-production|production-|-public|public-//g
(或者您正在使用的语言中的等效词)
请注意。如果支持\b
,则拼写为更正确
S / -production \ C | \ bproduction- | -public \ C | \ bpublic - //克
(以避免匹配像“&sub; 39&sub;出版物&#39;或&#39;出版物&#39;”等字词。
答案 1 :(得分:0)
你的正则表达式几乎就在那里:
([\s\S]*?)(?>production|public)
但这导致多次匹配
Match 1
Full match 0-17 `california-public`
Group 1. 0-11 `california-`
Match 2
Full match 17-39 `-local-card-production`
Group 1. 17-29 `-local-card-`
所以你必须多次匹配才能检索结果。