PowerShell Regex获取2个字符串之间的子字符串

时间:2017-10-03 04:32:27

标签: regex powershell

我正在尝试使用powershell从字符串中获取子字符串。我想得到“=%7B”和“%”

之间的字符串
my string = "onething=%7BABCDEFGHIJKLM%something=%7BNOPQRSTUVWXYZ%"

我使用正则表达式\=%7B([^%]+)\%并且能够获得

"=%7BABCDEFGHIJKLM%""=%7BNOPQRSTUVWXYZ%"

但不是2个字符串中的值。这是怎么做到的?

由于

2 个答案:

答案 0 :(得分:2)

使用regex lookaround非常简单:

(?<=\=%7)[A-Z]+(?=%)

online上试用。

如果你在中间使用更开放的模式,你应该添加一个不合适的标志:

(?<=\=%7).+?(?=%)

像这样使用:

$str="onething=%7BABCDEFGHIJKLM%something=%7BNOPQRSTUVWXYZ%"
$ret = [Regex]::Matches($str, "(?<=\=%7).+?(?=%)")
for($i = 0; $i -lt $ret.Count; $i++) {
    $ret[0].Value
}

您不需要使用捕获组,因为我的模式完全匹配。

说明:

正面观察(?<=%7) 断言正则表达式与字符%7字面匹配(区分大小写)

匹配[A-Z]+下面列表中的单个字符 +量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)
A-Z A和Z之间范围内的单个字符(区分大小写)

积极前瞻(?=%)
断言下面的正则表达式匹配:匹配字符%字面

全局模式标记 g修饰符:全局。所有比赛(首场比赛后不返回)
U修饰符:Ungreedy。默认情况下,匹配变得懒惰。现在一个?跟着量词使它变得贪婪

答案 1 :(得分:0)

看起来你很接近......我猜你的帖子是因为你没有发布完全正常工作的代码来重现问题...

我在regex101.com验证你的正则表达式之后在ISE中运行了这个。

$str="onething=%7BABCDEFGHIJKLM%something=%7BNOPQRSTUVWXYZ%"
$ret = [Regex]::Matches($str, "\=%7B([^%]+)\%")
$ret.Count
$ret[0].Groups[1].Value
$ret[1].Groups[1].Value

为我工作......

请注意,将来会使用适当的语法发布代码,以便更好地回答您的问题...尤其是当它们变得更具技术性时,您的PowerShell问题无疑将成为现实。