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