我目前正在使用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
我希望它尽可能简单。
提前谢谢
答案 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'
该技术是匹配和捕获(使用(...)
)我们需要的东西,并匹配我们需要删除的内容。
模式详情:
^
- 行的开头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
}