我正在尝试使用powershell从字符串中获取子字符串。我想得到“=%7B”和“%”
之间的字符串my string = "onething=%7BABCDEFGHIJKLM%something=%7BNOPQRSTUVWXYZ%"
我使用正则表达式\=%7B([^%]+)\%
并且能够获得
"=%7BABCDEFGHIJKLM%"
和"=%7BNOPQRSTUVWXYZ%"
但不是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问题无疑将成为现实。