正则表达式捕获组

时间:2014-03-03 12:05:21

标签: javascript regex

我正在学习正则表达式(目前正在使用Javascript)。

我的问题是:

我有一条很长的直字符串。

在这个字符串中至少有(强制性的)三种模式。

因此我希望rule.exec()字符串并获得一个三元素数组。每个模式都成一个单独的元素。

我该如何处理?目前我已经达到了它,但是有很多起伏,并且不知道应该如何对捕获进行分组?括号()是否将每组正则表达式分开。

我的正则表达式规则示例:

var rule = /([a-zA-Z0-9].*\s?(@classs?)+\s+[a-zA-Z0-9][^><]*)/g;
var str = "<Home @class www.tarjom.ir><string2 stringValue2>";
var res;
var keys = [];
var values = [];
while((res = rule.exec(str)) != null)
{
    values.push(res[0]);
}
 console.log(values);

// begin to slice them
var sliced = [];
for(item in values)
{
    sliced.push(values[item].split(" "));// converting each item into an array and the assign them to a super array
}



/// Last Updated on 7th of Esfand
console.log(sliced);

返回结果(使用firefox 27 - firebug console.log)

 [["Home", "@class", "www.tarjom.ir"]]

我得到了我需要的东西,我只需要对返回模式进行澄清。

1 个答案:

答案 0 :(得分:3)

是的,parentheses capture everything between them。捕获的组按其左括号编号。因此,如果/(foo)((bar)baz)/匹配,则您的第一个捕获的组将包含foo,第二个barbaz和第三个bar。在某些方言中,只有前9个捕获组被编号。

捕获的群组可用于backreferencing。如果你想匹配“foobarfoo”,/(foo)bar\1/会这样做,其中\1表示“我捕获的第一个群组”。

如果您只需要括号进行分组,有很多方法可以避免捕获。例如,如果你想匹配“foo”或“foobar”,/(foo(bar)?)/会这样做,但可能在第二组中捕获了“bar”。如果你想避免这种情况,请使用/(foo(?:bar)?)/只有一个捕获,“foo”或“foobar”。


your code显示三个值的原因是因为其他原因。首先,你做一个匹配。然后,你进行第一次捕获并在空间上拆分。 就是您在结果数组中添加的内容。请注意,您同时将整个数组推入其中,因此最终会得到一个数组数组。因此双括号。

你的正则表达式匹配(假装我们处于Perl的扩展易读性模式):

/                   # matching starts
  (                 # open 1st capturing group
    [a-zA-Z0-9]     # match 1 character that's in a-z, A-Z, or 0-9
    .*              # match as much of any character possible
    \s?             # optionally match a white space (this will generally never happen, since the .* before it will have gobbled it up)
    (               # open 2nd capturing group
      @classs?      # match '@class' or '@classs'
    )+              # close 2n group, matching it once or more
    \s+             # match one or more white space characters
    [a-zA-Z0-9]     # match 1 character that's in a-z, A-Z, or 0-9
    [^><]*          # match any number of characters that's not an angle bracket
  )                 # close 1st capturing group
/g                  # modifiers - g: match globally (repeatedly match throughout entire input)