使用正则表达式匹配模式后排除子字符串

Posted

技术标签:

【中文标题】使用正则表达式匹配模式后排除子字符串【英文标题】:Exclude a substring after a pattern is matched using regex 【发布时间】:2022-01-03 09:26:29 【问题描述】:

我想编写一个拆分字符串的正则表达式,例如只选择几个元素。例如: M:\Shares\Profiles\Server\Profiles\abcd.contoso.V2.01

我的目标是:

abcd.V2.01,这样就去掉了'contoso'这个域名

但是,在找到匹配项后,我无法排除部分字符串。我试过了

$original = 'M:\Shares\Profiles\Server\Profiles\abcd.contoso.V2.01'
$modified = $original -replace '.*\\([^\\.]+.contoso.V2)[^\\]*$', '$1'

返回 $modified'abcd.contoso.V2'

【问题讨论】:

如果你要替换的东西是一个常数,那么这个 >>> 'M:\Shares\Profiles\Server\Profiles\abcd.contoso.V2.01'.Split('\')[-1] -replace '\.contoso' 【参考方案1】:

您可以使用两个捕获组:

$original = 'M:\Shares\Profiles\Server\Profiles\abcd.contoso.V2.01'
$original -replace '.*\\([^\\.]*)\.contoso(\.V2[^\\]*)$', '$1$2'
# => abcd.V2.01

不要忘记在正则表达式模式中转义文字点。这是demo of the above regex。 详情

.* - 除 LF 字符外的任何零个或多个字符 \\ - 一个 \ 字符 ([^\\.]*) - 第 1 组 ($1):除 \. 之外的任何零个或多个字符 \.contoso - .contoso 字符串 (\.V2[^\\]*) - 第 2 组 ($2):.V2 字符串,然后是除 \ 之外的任何零个或多个字符 $ - 字符串结束。

【讨论】:

以上是关于使用正则表达式匹配模式后排除子字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式方法

5.2.1 正则表达式语法与子模式扩展语法

如何匹配,但排除正则表达式模式?

如何使用正则表达式匹配不以某些字符开头或结尾的单词?

Redshift 正则表达式匹配直到模式匹配但不包含模式

正则表达式基本用法