正则表达式捕获字符串直到遇到另一个字符串
Regex to capture string until another string is encountered
我想匹配 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',
如您所见,前面的 space 由于某种原因未被删除,甚至 regex101.com 也表明所有白色 space 都在正则表达式中使用
'string1[^']*'\s*,\s*
这是我目前正在使用的(其中 server 是一个已经在脚本中定义的变量)
sed -i '' "s/'${server}[^']*'\s*,\s*//"
这应该符合您的要求(根据您的 粗体 突出显示)允许未知数量的空格等。
(?:…)
是一个 非捕获 组。
…+?
是一个 非贪婪 匹配(尽可能少的 x)
(string1.+?)(?:'string2)
(string1.+?)'string2
匹配以 '
开头然后有 string1
的字符串,然后是 '
以外的任何字符,出现 0 次或多次,然后是可选数量的空格、逗号和又是 0+ 个空格,你可以使用
'string1[^']*'\s*,\s*
参见regex demo。
细分:
'string1
- 文字字符序列 'string1
[^']*
- '
以外的零个或多个 (*
) 个字符(由于否定字符 class [^...]
)
'
- 撇号
\s*
- 0+ 个空格
,
- 逗号
\s*
- 0+ 个空格。
我想匹配 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',
如您所见,前面的 space 由于某种原因未被删除,甚至 regex101.com 也表明所有白色 space 都在正则表达式中使用
'string1[^']*'\s*,\s*
这是我目前正在使用的(其中 server 是一个已经在脚本中定义的变量)
sed -i '' "s/'${server}[^']*'\s*,\s*//"
这应该符合您的要求(根据您的 粗体 突出显示)允许未知数量的空格等。
(?:…)
是一个 非捕获 组。
…+?
是一个 非贪婪 匹配(尽可能少的 x)
(string1.+?)(?:'string2)
(string1.+?)'string2
匹配以 '
开头然后有 string1
的字符串,然后是 '
以外的任何字符,出现 0 次或多次,然后是可选数量的空格、逗号和又是 0+ 个空格,你可以使用
'string1[^']*'\s*,\s*
参见regex demo。
细分:
'string1
- 文字字符序列'string1
[^']*
-'
以外的零个或多个 (*
) 个字符(由于否定字符 class[^...]
)'
- 撇号\s*
- 0+ 个空格,
- 逗号\s*
- 0+ 个空格。