PowerShell -replace获取两个不同字符之间的字符串

时间:2017-07-25 21:20:14

标签: regex powershell

我目前正在使用split来获得我需要的东西,但我希望我能在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 个答案:

答案 0 :(得分: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

该技术是匹配和捕获(使用(...))我们需要的东西,并匹配我们需要删除的内容。

模式详情

  • ^ - 行的开头
  • server= - 文字子字符串
  • ([^;]+) - 第1组($1指的是哪个)匹配除;以外的1个字符
  • .* - 除了换行符之外的任何0 +字符,尽可能多

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

注意:如果您需要提取的值可能会出现在字符串中的任何位置,请将^替换为第一个^[^;]*;模式,将第二个.*?\b模式替换为{{ 1}}(除了换行符之外的任何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个非换行符
  • ;database= - 文字子字符串
  • ([^;]+) - 除;以外的1个字符

答案 1 :(得分: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
}