我正在学习正则表达式(目前正在使用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"]]
我得到了我需要的东西,我只需要对返回模式进行澄清。
答案 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)