Javascript 正则表达式捕获组

Javascript 正则表达式捕获组,javascript,regex,Javascript,Regex,我正在学习正则表达式(目前使用Javascript) 我的问题是: 我有一根一定长度的直绳子 在这个字符串中,至少(必须)有三种模式 因此,我想要rule.exec()string并获得一个三元素数组。每个图案都包含一个单独的元素 我应该如何处理这个问题?目前我已经做到了,但是有很多起伏,不知道到底应该怎么做才能抓到a组?是括号()分隔了每组正则表达式 我的正则表达式规则示例: var rule = /([a-zA-Z0-9].*\s?(@classs?)+\s+[a-zA-Z0-9][^>

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

我的问题是:

我有一根一定长度的直绳子

在这个字符串中,至少(必须)有三种模式

因此,我想要
rule.exec()
string并获得一个三元素数组。每个图案都包含一个单独的元素

我应该如何处理这个问题?目前我已经做到了,但是有很多起伏,不知道到底应该怎么做才能抓到a组?是括号
()
分隔了每组正则表达式

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

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);
我已经得到了我所需要的,我只需要一个关于返回模式的澄清

是的。捕获的组通过其左括号进行编号。因此,如果
/(foo)((bar)baz)/
匹配,则第一个捕获的组将包含
foo
、第二个
barbaz
、第三个
bar
。在某些方言中,只有前9个捕获组被编号

捕获的组可用于。如果要匹配“foobarfoo”,则
/(foo)bar\1/
将执行该操作,其中
\1
表示“我捕获的第一组”

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


原因显示了三个价值观,是因为其他原因。首先,你做一场比赛。然后,你把你的第一个捕获和分裂的空间。这就是您在结果数组中输入的内容。请注意,您一次将整个数组推入其中,因此最终得到一个数组数组。因此出现了双括号

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

/#匹配开始
(#打开第一捕获组
[a-zA-Z0-9]#匹配a-z、a-z或0-9中的1个字符
.#尽可能多地匹配任何字符
\s?#可选地匹配一个空白(这通常不会发生,因为。*之前它会吞噬它)
(#开放第二捕获组
@classs?#匹配'@class'或'@classs'
)+#关闭2n组,匹配一次或多次
\s+#匹配一个或多个空白字符
[a-zA-Z0-9]#匹配a-z、a-z或0-9中的1个字符
[^>是的,.捕获的组通过其左括号进行编号。因此,如果
/(foo)((bar)baz)/
匹配,则第一个捕获的组将包含
foo
、第二个
barbaz
、第三个
bar
。在某些方言中,仅对前9个捕获组进行编号

捕获的组可用于。如果要匹配“foobarfoo”,则
/(foo)bar\1/
将执行此操作,其中
\1
表示“我捕获的第一个组”

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


之所以显示三个值,是因为其他原因。首先,进行匹配。然后,获取第一个捕获并将其拆分到一个空间中。这就是您在结果数组中放置的内容。请注意,您一次将整个数组推入其中,因此最终得到一个数组数组。因此使用双括号

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

/#匹配开始
(#打开第一捕获组
[a-zA-Z0-9]#匹配a-z、a-z或0-9中的1个字符
.#尽可能多地匹配任何字符
\s?#可选地匹配一个空白(这通常不会发生,因为。*之前它会吞噬它)
(#开放第二捕获组
@classs?#匹配'@class'或'@classs'
)+#关闭2n组,匹配一次或多次
\s+#匹配一个或多个空白字符
[a-zA-Z0-9]#匹配a-z、a-z或0-9中的1个字符
[^>是的,.捕获的组通过其左括号进行编号。因此,如果
/(foo)((bar)baz)/
匹配,则第一个捕获的组将包含
foo
、第二个
barbaz
、第三个
bar
。在某些方言中,仅对前9个捕获组进行编号

捕获的组可用于。如果要匹配“foobarfoo”,则
/(foo)bar\1/
将执行此操作,其中
\1
表示“我捕获的第一个组”

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


之所以显示三个值,是因为其他原因。首先,进行匹配。然后,获取第一个捕获并将其拆分到一个空间中。这就是您在结果数组中放置的内容。请注意,您一次将整个数组推入其中,因此最终得到一个数组数组。因此使用双括号

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

/#匹配开始
(#打开第一捕获组
[a-zA-Z0-9]#匹配a-z、a-z或0-9中的1个字符
.#尽可能多地匹配任何字符
\s?
 [["Home", "@class", "www.tarjom.ir"]]
/                   # 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)