-2

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

我的组合正则表达式没有按我想要的方式工作,因为它返回所有匹配模式的出现,这意味着其中三个返回。

任何意见,将不胜感激。

4

1 回答 1

1

描述

考虑以下应该在 javascript 中工作的正则表达式的 powershell 示例(或者它在http://www.pagecolumn.com/tool/regtest.htm上为我做了。正则表达式组返回 $1 将包含属性区域中的值子字符串第二个选项。我确实修改了您的源文本以说明这也会在属性子字符串中找到下划线。

^.*?_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 组的属性字段,您可以修改正则表达式,将非贪婪搜索变为非捕获块,然后进行计数。这些可以在www.pcreck.com/JavaScript/advanced进行测试

  • ^(?:.*?_0_){0}[^_]*[_](.*?)(?=_0_|$)匹配first_attributes
  • ^(?:.*?_0_){1}[^_]*[_](.*?)(?=_0_|$)匹配Attributes_ToVoteFor
  • ^(?:.*?_0_){2}[^_]*[_](.*?)(?=_0_|$)匹配attributes
  • ^(?:.*?_0_){3}[^_]*[_](.*?)(?=_0_|$)匹配name
于 2013-05-12T14:35:20.350 回答