我正在尝试从使用的备份命令中解析出我们的备份路径,即网络共享。
这就是备份命令的样子:
constructor() {
this.state = {
inputLength: new Animated.Value(100), // initial value
isFocused: false
}
}
onFocus() {
Animated.timing(this.state.inputLenght, {
toValue: 90, // or whatever value
duration: 1000
}).start(() => this.setState({isFocused: true}))
}
onBlur() {
Animated.timing(this.state.inputLenght, {
toValue: 100, // or whatever value
duration: 1000
}).start(() => this.setState({isFocused: false}))
}
<Animated.View style={{width: this.state.inputLength}}>
<TextInput
ref="input"
onFocus={this.onFocus}
onBlur={this.onBlur}
...
/>
</Animated.View>
{this.state.isFocused && (
<TouchableOpacity onPress={() => this.refs.input.blur()}><Text>Submit</Text></TouchableOpacity>
)}
我想要的是获得所有网络分享....
BACKUP DATABASE [UnitTestDB] TO DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_2.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_3.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_4.bak' WITH CHECKSUM, COMPRESSION
没有单引号,只有值。
我可以使用http://regexstorm.net/tester,但我似乎无法将其转换回PowerShell术语。这是在测试器中起作用的匹配表达式......
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_2.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_3.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_4.bak
但PowerShell只返回四场比赛中的一场,并且还返回[DISK = N'](\S*)[']
。它必须是一些语法错误,我没有抓住。
输出:
N'
这是我到目前为止的代码......
Groups : { N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak',
N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak}
Success : True
Captures : { N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak'}
Index : 38
Length : 100
Value : N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak'
答案 0 :(得分:2)
使用[regex]::Matches
代替Match
来获取多个匹配。要获取捕获组,您必须访问属性Groups[1].Value
。另外,你的正则表达式错了,你必须省略方括号:
$backupCommand = "BACKUP DATABASE [UnitTestDB] TO DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_2.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_3.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_4.bak' WITH CHECKSUM, COMPRESSION"
[regex]::Matches($backupCommand,"DISK = N'(\S*)[']") | Foreach {
$_.Groups[1].Value
}
<强>输出:强>
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_2.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_3.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_4.bak
这样可行,但由于如果网络路径包含空格,您的捕获组将失败,我会将正则表达式更改为捕获全部,直到尾随'
:
DISK = N'([^']+)
答案 1 :(得分:2)
正则表达式解决方案有很多选择。 Martin's answer解释了为什么您没有得到预期的结果,并且您需要使用静态方法[regex]::Matches
返回所有结果。您也可以使用Select-String
-AllMatches
开关来执行相同的操作。由于它返回matchinfo对象,您还需要进行一些后期处理。
我根据您的源数据使用了不同的正则表达式。返回双引号组之间的匹配。如果我使用前瞻和后面的话我可以让这更简洁,但我想保持正则表达式简单。
$regex = "'(.*?)'"
($data | Select-String -Pattern $regex -AllMatches).Matches |
ForEach-Object{$_.Groups[1].Value}