2017-07-25 141 views
1

我目前使用分裂来获得我所需要的,但我希望我可以在PowerShell中使用更好的方法。PowerShell - 取代两个不同的字符之间的字符串

这里是字符串:

server=ss8.server.com;database=CSSDatabase;uid=WS_CSSDatabase;pwd=abc123-1cda23-123-A7A0-CC54;Max Pool Size=5000 

我想要得到的服务器和数据库进行数据库=或服务器=

这里是我目前使用的方法,这就是我我目前在做:

$databaseserver = (($details.value).split(';')[0]).split('=')[1] 
$database = (($details.value).split(';')[1]).split('=')[1] 

此输出到:

ss8.server.com 
CSSDatabase 

我希望它尽可能简单。

预先感谢您

回答

2

更换方法

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

$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' 

enter image description here

技术是匹配和捕获(与(...) )我们需要什么,只是匹配我们需要去除的东西即

图案的详细资料

  • ^ - 文字串
  • ([^;]+) - - 第1组(什么$1指)匹配其它字符1+比;
  • server=开始
  • .* - 除换行符以外的任何0+字符,尽可能多

模式2几乎相同,捕获组被移动一点以捕获另一个细节,并且添加一些更多的文字值以匹配正确的上下文。

注意:如果你需要提取的值可以在字符串中的任何地方出现,在第二个与.*?\b(任何0+除换行符替换字符在^第一个和^[^;]*;模式,少可能跟着一个字的边界)。

匹配方法

随着-match,你可以做以下方式:

$s -match '^server=(.+?);database=([^;]+)' 

$Matches[1]将包含服务器的详细信息和$Matches[2]将持有的DB信息:

Name       Value 
----       ----- 
2        CSSDatabase 
1        ss8.server.com 
0        server=ss8.server.com;database=CSSDatabase 

花纹细节

  • ^ - 串
  • server=的开始 - 字面子
  • (.+?) - 第1组:任何1+非断行字符尽可能少
  • ;database= - 字面子
  • ([^;]+) - 1+以外的字符;
+0

哇,谢谢!只有一件事,如果我想说“数据库=”或“服务器=”不存在,我怎么能提醒匹配语句或替换语句。 – Stealthmatt

+0

@Stealthmatt你可以使用'$ a.Contains(“server =”)'方法。或者当使用匹配的方法时,检查'$ Matches'实际上是否有任何值。 –

1

另一种使用RegEx和命名捕获组的解决方案,与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 
} 
相关问题