正则表达式:仅捕获第二次出现

时间:2013-05-12 12:20:20

标签: javascript regex

我正在写一个正则表达式来提取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)

我的复合正则表达式不能按我想要的方式工作,因为它会返回所有匹配模式,这意味着它们中的三个返回。

任何建议都将受到赞赏。

1 个答案:

答案 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
  • 相匹配