除了字符串的一部分外,正则表达式从字符串中捕获所有内容

时间:2018-02-07 12:28:28

标签: regex regex-group

我正在尝试创建一个正则表达式,它将捕获字符串中的所有内容,但字符串的特定部分除外。他最好的起点似乎是使用小组。

例如,我想从字符串中捕获除“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? 这似乎是在正则表达式中无法解决的。

2 个答案:

答案 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-`

所以你必须多次匹配才能检索结果。