PowerShell - 取代两个不同的字符之间的字符串
问题描述:
我目前使用分裂来获得我所需要的,但我希望我可以在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
我希望它尽可能简单。
预先感谢您
答
更换方法
您可以使用下面的正则表达式替换:
$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'
技术是匹配和捕获(与(...)
)我们需要什么,只是匹配我们需要去除的东西即
图案的详细资料:
-
^
- 文字串 -
([^;]+)
- - 第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+以外的字符;
答
另一种使用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
}
哇,谢谢!只有一件事,如果我想说“数据库=”或“服务器=”不存在,我怎么能提醒匹配语句或替换语句。 – Stealthmatt
@Stealthmatt你可以使用'$ a.Contains(“server =”)'方法。或者当使用匹配的方法时,检查'$ Matches'实际上是否有任何值。 –