我正在写一个正则表达式来提取javascript中第二次出现的匹配。 我想要的摘录是位于“root_first_attributes_0_second_”之后的“attributes_”。 有关示例,请参阅下面的代码段。
template = "root_first_attributes_0_second_attributes_0_third_attributes_0_third_name"
my regex
==========
var n = template.match(/(attributes[_\]\[]+)\d+/g)
我的复合正则表达式不能按我想要的方式工作,因为它会返回所有匹配模式,这意味着它们中的三个返回。
任何建议都将受到赞赏。
答案 0 :(得分:1)
考虑以下powershell示例的正则表达式应该在javascript中工作(或者它在http://www.pagecolumn.com/tool/regtest.htm上为我做了。正则表达式组返回$ 1将包含第二个选项的属性区域中的值substring。我做了修改源文本以说明这也将在属性子字符串中找到下划线。
^.*?_0_[^_]*[_](.*?)(_0_|$)
$Matches = @()
$String = 'root_first_attributes_0_second_Attributes_ToVoteFor_0_third_attributes_0_third_name'
Write-Host start with
write-host $String
Write-Host
Write-Host found
([regex]'^.*?_0_[^_]*[_](.*?)(_0_|$)').matches($String) | foreach {
write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
} # next match
开始于:
root_first_attributes_0_second_Attributes_ToVoteFor_0_third_attributes_0_third_name
发现 键31 ='Attributes_ToVoteFor'
^
从字符串.*?
移动到最少数量的字符_0_
第一个分隔符[^_]*
然后浏览下一个非下划线字符[_]
直到您阅读第一个下划线(.*?)
在(_0_|$)
下一个分隔符或字符串结尾要捕获列表中第X个组的属性字段,可以通过将非贪婪搜索转换为非捕获块后跟count来修改正则表达式。这些可以在www.pcreck.com/JavaScript/advanced
进行测试^(?:.*?_0_){0}[^_]*[_](.*?)(?=_0_|$)
与first_attributes
^(?:.*?_0_){1}[^_]*[_](.*?)(?=_0_|$)
与Attributes_ToVoteFor
^(?:.*?_0_){2}[^_]*[_](.*?)(?=_0_|$)
与attributes
^(?:.*?_0_){3}[^_]*[_](.*?)(?=_0_|$)
与name