如何让我的正则表达式方法返回所有路径匹配?

时间:2016-06-15 17:02:24

标签: regex powershell

我正在尝试从使用的备份命令中解析出我们的备份路径,即网络共享。

这就是备份命令的样子:

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'

2 个答案:

答案 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'([^']+)

Regular expression visualization

答案 1 :(得分:2)

正则表达式解决方案有很多选择。 Martin's answer解释了为什么您没有得到预期的结果,并且您需要使用静态方法[regex]::Matches返回所有结果。您也可以使用Select-String -AllMatches开关来执行相同的操作。由于它返回matchinfo对象,您还需要进行一些后期处理。

我根据您的源数据使用了不同的正则表达式。返回双引号组之间的匹配。如果我使用前瞻和后面的话我可以让这更简洁,但我想保持正则表达式简单。

$regex = "'(.*?)'"

($data | Select-String -Pattern $regex -AllMatches).Matches | 
    ForEach-Object{$_.Groups[1].Value}