我正在尝试从URL字符串获取令牌。
示例网址(显然已更改为不发布敏感内容):
https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb¶meter2=some_value
我正在尝试制作仅返回令牌的正则表达式。
https://example.com/file.extention?validation.token= kDa9udKcYp1Wo2ay5Lbb &parameter2 = some_value
我首先搜索“ token =“,然后将其从结果中排除。为此,我尝试了不匹配的组和其他解决方案。但是我目前正在寻找环顾四周。然后我匹配要返回的令牌。这似乎正在工作。我的问题是,URL可能包含或可能不包含更多参数。因此,我再次环顾四周,说令牌将在其后跟一个“&”,或者是(行/字符串)“ $”的结尾。这是麻烦的部分。
我当前的正则表达式:
(?<=token\=)([\w\d\S]*)(?=[\&|$])
Flags: gm (as of now)
如链接所示,它可以工作。当URL字符串仅包含令牌时,它将不起作用。
令牌为20个字符,所以我想出了以下变体:
(?<=token\=)([\w\d\S]{1,20})
Flags: gm (as of now)
这正常工作,但是我正在使工作流程自动化,并且令牌在将来的更新中可能会更改,所以我希望进行尽可能少的维护。
我不能在“ token =”和(“&”或“ $”结尾((line | string))之间的字符串搜索吗?
URL中也可能有#anchors,如果我只是检查下一个&符号,则可能无意地将其包含在令牌中。另外,按照某些建议的操作,它可以跨越多行,如HERE所示。
答案 0 :(得分:1)
此功能使用Uri和HttpUtility类内置于.NET / PowerShell:
$url0 = 'https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb';
$url1 = 'https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb¶meter2=some_value';
[System.Web.HttpUtility]::ParseQueryString(([uri]$url0).Query)['validation.token'];
[System.Web.HttpUtility]::ParseQueryString(([uri]$url1).Query)['validation.token'];
答案 1 :(得分:0)
您也可以进行简单拆分:
$str = 'https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb¶meter2=some_value'
(($str -split '&' -match 'token') -split '=')[1]
答案 2 :(得分:0)
在否定的character class #
中,您不能匹配与号或[^&#]+
答案 3 :(得分:0)
只是为了kix ..
$url = "https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb¶meter2=some_value"
(ConvertFrom-StringData ([uri]$url).Query.Substring(1).Replace("&", [environment]::NewLine))['validation.token']
答案 4 :(得分:0)
关于您自己的尝试的一些评论:
[\w\d\S]
-\w
(文字字符)包含数字,因此\d
是多余的。此外,&
与无空格类\S
匹配。[\&|$]
-无需在字符类中转义&
,而在字符类中转义$
则表示文字字符$
-不是 end线。尝试
token=(\w+)(?=&|$)
这将为您提供捕获组1中的令牌。我看不到您提到它,但是我假设令牌只能由字母和数字组成。
与UnbearableLightness建议相似,但效果要好10倍左右。 (性能可能不是问题,但是...)