【问题标题】:Regex to capture string until another string is encountered正则表达式捕获字符串,直到遇到另一个字符串
【发布时间】:2017-03-19 19:38:18
【问题描述】:

我想匹配 string1 以及以下行中出现的任何内容:

['string1','string2','string3']
['string1' , 'string2' , 'string3']
['string1.domain.com' , 'string2.domain.com' , 'string3.domain.com']
['string1.domain.com:8080' , 'string2.domain.com:8080' , 'string3.domain.com:8080']

直到遇到以下情况:

string2

因此,在上述 4 种情况下使用正确的正则表达式,粗体的结果将匹配:

['string1','string2','string3']

['string1','string2','string3']

['string1.domain.com' , 'string2.domain.com' , 'string3.domain.com']

['string1.domain.com:8080' , 'string2.domain.com:8080' , 'string3.domain.com:8080']


我尝试使用以下线程来解决https://regex101.com/ 的问题

我尝试的正则表达式来自Question 8020848,但未能正确匹配字符串:

((^|\.lpdomain\.com:8080' , ')(string1))+$

但是我只匹配了我想要在本文中匹配的部分并不成功:

['string1.domain.com:8080' , 'string2.domain.com:8080' , 'string3.domain.com:8080']

以下是我使用您建议的正则表达式收到的内容

@@ -108,7 +108,7 @@ node stringA, stringB, stringC,stringD inherits default {
   'ssl_certificate_file' => 'test.domain.net_sha2_n.crt',
   'ssl_certificate_key_file'=> 'test.domain.net_sha2.key' }
 },
-    service_upstream_members         => ['string1.domain.com:8080', 'string2.domain.com:8080', 'string3.domain.com:8080', 'string4.domain.com:8080', 'string5.domain.com:8080'],
+    service_upstream_members         => [ 'string2.domain.com:8080', 'string3.domain.com:8080', 'string4.domain.com:8080', 'string5.domain.com:8080'],
 service2_upstream_members      => ['string9:8080','string10:8080'],
 service3_upstream_members  => ['string11.domain.com:8080','string12.domain.com:8080','string13.domain.com:8080'],
 service_name                      => 'test_web_nginx_z1',

如您所见,由于某种原因没有删除前面的空格,甚至 regex101.com 也证明所有空格都使用

在正则表达式中捕获
'string1[^']*'\s*,\s*

这是我目前正在使用的(其中 server 是脚本中已经定义的变量)

sed -i '' "s/'${server}[^']*'\s*,\s*//"

【问题讨论】:

  • 'string1[^']*' 怎么样?
  • 好,但不包括空格。有几种组合可能是: ','string2 OR ' , 'string2 OR ', 'string2 需要它包括所有直到 ' 紧接在 string2 之前的所有内容
  • 你的意思是你也需要空格+逗号+空格? 'string1[^']*'\s*,\s*?
  • 尝试将\s 替换为[[:space:]]。不确定它是否会有所帮助,我不是 Mac OSX 方面的专家,但是是的,据我所知是有区别的。
  • 完成了这项工作。

标签: regex regex-greedy


【解决方案1】:

要匹配以' 开头然后是string1 的字符串,然后是' 以外的任何字符,出现0 次或更多次,然后是可选数量的空格、逗号和0+ 空格,您可以使用

'string1[^']*'\s*,\s*

请参阅regex demo

细分:

  • 'string1 - 文字字符序列 'string1
  • [^']* - 除' 之外的零个或多个 (*) 字符(由于取反字符类 [^...]
  • ' - 撇号
  • \s* - 0+ 个空格
  • , - 逗号
  • \s* - 0+ 个空格。

【讨论】:

    【解决方案2】:

    这应该符合您的要求(根据您的粗体突出显示),允许未知数量的空格等。

    (?:…) 是一个 非捕获 组。
    …+? 是一个 非贪婪 匹配(尽可能少的 x)

    (string1.+?)(?:'string2)

    (string1.+?)'string2

    查看示例:https://regex101.com/r/lFPSEM/3

    【讨论】:

    • (?:'string2)不应该在非捕获组内,这里的分组结构内只有1个分支,是多余的。
    • 如果您假设使用了一致的空格、逗号和单引号序列,那么您是对的。但是,一旦缺少该序列,您的示例就会中断。我相信我的方法更紧密地反映了 OP 的“从 thisthat”的想法。
    • 如果是这样,我会以stackoverflow.com/questions/12736074/… 的欺骗来结束这个问题,正确的模式是('string1.+?)'string2
    • 是的。一个冗余的非捕获组:)
    • (string1.+?)'string2 将在['string1', 'string0.sssss', 'string2','string3'] 中捕获"string1', 'string0.sssss', ",我怀疑根据提供的输入判断这是需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多