我正在尝试使用PowerShell从下面的行中提取链接文本。
<a href="javascript:showPopupWindow('catdesc.jsp?catnum=20')">Entertainment</a>, <a href="javascript:showPopupWindow('catdesc.jsp?catnum=5')">Intimate Apparel/Swimsuit</a>, and <a href="javascript:showPopupWindow('catdesc.jsp?catnum=92')">Suspicious</a>
我尝试了以下内容,但它仅匹配第一个结果,并且包含我不想要的>
和<
。我确定这是正则表达式的一个问题,但我不太清楚它看错了什么。请注意,上面的字符串是$result.categorization
$result.categorization -match '(\>(.*?)\<)'
返回
Name,Value
2,Entertainment
1,>Entertainment<
0,>Entertainment<
我想返回
Name,Value
2,Suspicious
1,Intimate Apparel/Swimsuit
0,Entertainment
我还尝试了列出的正则表达式Regular expression to extract link text from anchor tag,但这与任何内容都不匹配。
答案 0 :(得分:1)
我不知道输出中的标题和数字来自哪里,但是这里是一个解决方案,它完全按照指定的方式从单行输入中提取链接文本:
$str = @'
<a href="javascript:showPopupWindow('catdesc.jsp?catnum=20')">Entertainment</a>, <a href="javascript:showPopupWindow('catdesc.jsp?catnum=5')">Intimate Apparel/Swimsuit</a>, and <a href="javascript:showPopupWindow('catdesc.jsp?catnum=92')">Suspicious</a>
'@
$str -split ', and |, ' -replace '.*?>([^<]*).*', '$1'
$str -split ', and |, '
将输入行拆分为单独的<a>
元素。
-replace
然后分别对每个<a>
元素进行操作:
'.*?>([^<]*).*'
与整个行匹配,但仅捕获唯一捕获组(...)
中的链接文本。$1
然后用捕获组匹配的内容替换整行,即实际上只返回链接文本。 至于你的尝试:
-match
从不提取其输入的部分 - 它会返回 Boolean ,指示是否找到与标量 LHS匹配的内容,或带有数组作为LHS的匹配项的过滤子数组。
也就是说,自动$Matches
变量确实包含有关哪些部分匹配的信息,但仅包含标量 LHS的信息。
'(\>(.*?)\<)'
包含两个嵌套的捕获组,它们与文字>
匹配,后跟任意数量的字符(非贪婪匹配),后跟文字<
。
内部捕获组将捕获链接文本。
但是:
>
和<
做不需要\
- 在正则表达式中转义(虽然没有任何损害)。