Regex PowerShell-替换以获取两个不同字符之间的字符串

Regex PowerShell-替换以获取两个不同字符之间的字符串,regex,powershell,Regex,Powershell,我目前正在使用split来获得我需要的,但我希望我能在powershell中使用更好的方法 以下是字符串: server=ss8.server.com;database=CSSDatabase;uid=WS_CSSDatabase;pwd=abc123-1cda23-123-A7A0-CC54;Max Pool Size=5000 我想在不使用database=或server的情况下获取服务器和数据库= 这是我目前使用的方法,也是我目前正在做的: $databaseserver = (($de

我目前正在使用split来获得我需要的,但我希望我能在powershell中使用更好的方法

以下是字符串:

server=ss8.server.com;database=CSSDatabase;uid=WS_CSSDatabase;pwd=abc123-1cda23-123-A7A0-CC54;Max Pool Size=5000
我想在不使用database=或server的情况下获取服务器和数据库=

这是我目前使用的方法,也是我目前正在做的:

$databaseserver = (($details.value).split(';')[0]).split('=')[1]
$database = (($details.value).split(';')[1]).split('=')[1]
这将输出到:

ss8.server.com
CSSDatabase
我希望它尽可能简单


提前感谢您

更换方法

您可以使用以下正则表达式替换:

$s = 'server=ss8.server.com;database=CSSDatabase;uid=WS_CSSDatabase;pwd=abc123-1cda23-123-A7A0-CC54;Max Pool Size=5000'
$dbserver = $s -replace '^server=([^;]+).*', '$1'
$db = $s -replace '^[^;]*;database=([^;]+).*', '$1'

技术是匹配和捕获(使用
(…)
)我们需要的内容,然后只匹配我们需要删除的内容

图案细节

  • ^
    -行首
  • server=
    -文本子字符串
  • ([^;]+)
    -第1组(
    $1
    所指的内容)匹配除
    以外的1+字符
  • *
    -新行以外的任何0+字符,尽可能多
模式2几乎是相同的,捕获组被移动了一点以捕获另一个细节,并且添加了更多的文本值以匹配正确的上下文

注意:如果需要提取的值可能出现在字符串中的任何位置,请将第一个值中的
^
替换为
^[^;]*模式带有
*?\b
(除换行符以外的任何0+字符,尽可能少,后跟单词边界)

匹配方法

使用
-match
,您可以按以下方式进行:

$s -match '^server=(.+?);database=([^;]+)'
$Matches[1]
将包含服务器详细信息,
$Matches[2]
将保存数据库信息:

Name                           Value
----                           -----
2                              CSSDatabase
1                              ss8.server.com
0                              server=ss8.server.com;database=CSSDatabase
图案细节

  • ^
    -字符串的开头
  • server=
    -文字子字符串
  • (.+?)
    -第1组:任何1+非换行符尽可能少
  • ;数据库=
    -文字子字符串
  • ([^;]+)
    -1+字符,而不是

另一个具有正则表达式和命名捕获组的解决方案,类似于Wiktor的匹配方法

$s = 'server=ss8.server.com;database=CSSDatabase;uid=WS_CSSDatabase;pwd=abc123-1cda23-123-A7A0-CC54;Max Pool Size=5000'
$RegEx = '^server=(?<databaseserver>[^;]+);database=(?<database>[^;]+)'
if ($s -match $RegEx){
    $Matches.databaseserver
    $Matches.database
}
$s='server=ss8.server.com;数据库=CSSDatabase;uid=WS_CSSDatabase;pwd=abc123-1cda23-123-A7A0-CC54;最大池大小=5000'
$RegEx='^server=(?[^;]+);数据库=(?[^;]+)'
如果($s-匹配$RegEx){
$Matches.databaseserver
$Matches.database
}

哇,谢谢你!只有一件事,如果我想在说“database=”或“server=”不存在时陷阱,我如何警告match语句或replace语句。@Stealthmat您可以使用
$a.Contains(“server=”)
方法。或者在使用匹配方法时,检查
$Matches
是否实际具有任何值。