0

我想使用 javascript 解析与此类似的模式:

@[10] or @[15]

经过我所有的努力,我想出了这个:

@\\[(.*?)\\]

这种模式工作正常,但问题是它匹配任何 b/w 方括号。我希望它只匹配数字。我也试过这些:

@\\[(0-9)+\\]

@\\[([(0-9)+])\\]

但这些都不匹配。

另外,我只想匹配完整单词而不是字符串中单词的一部分的模式。即如果它不是开始或结束脚本,则两边都应该包含空格。这意味着它不应该匹配这样的短语:

abxdcs@[13]fsfs

提前致谢。

4

3 回答 3

1

使用正则表达式:

/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g

@[number]如果模式 ( ) 不是单词的一部分,它将匹配。如果它不是开始或结束字符串,则两边应包含空格。

它使用组,因此如果需要数字,请使用组 1。

测试代码(点击这里查看演示):

console.log(/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g.test("@[10]")); // true
console.log(/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g.test("@[15]")); // true
console.log(/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g.test("abxdcs@[13]fsfs")); // false
console.log(/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g.test("abxdcs @[13] fsfs")); // true

var r1 = /(?:^|\s)@\[([0-9]+)\](?=$|\s)/g
var match = r1.exec("@[10]");
console.log(match[1]); // 10

var r2 = /(?:^|\s)@\[([0-9]+)\](?=$|\s)/g
var match2 = r2.exec("abxdcs @[13] fsfs");
console.log(match2[1]); // 13

var r3 = /(?:^|\s)@\[([0-9]+)\](?=$|\s)/g
var match3;
while (match3 = r3.exec("@[111] @[222]")) {
    console.log(match3[1]);
}
// while's output: 
// 111
// 222
于 2013-06-12T19:52:47.740 回答
0

您不需要字符类中的这么多字符。更重要的是,您将 + 放在了错误的位置。试试这个:@\\[([0-9]+)\\]

于 2013-06-12T19:53:32.497 回答
0

你很接近,但你需要使用方括号:

@\[[0-9]+\]

或者,更短的版本:

@\[\d+\]

您需要这些斜杠的原因是“转义”方括号。通常它们用于表示“字符类”。

[0-9]创建一个字符类,它与 0 到 9 范围内的一位数字完全匹配。添加将+含义更改为“一个或多个”。\d只是[0-9].

当然,反斜杠字符也用于转义 javascript 字符串中的字符,这就是您必须转义它们的原因。所以:

javascript

"@\\[\\d+\\]"

变成:

正则表达式

@\[\d+\]

用于匹配:

@文字“@”符号
\[文字“[”符号
\d+一个或多个数字(几乎等同于[0-9]+
\]文字“]”符号

我说这几乎\d是一样的,因为在某些正则表达式风格(包括 .NET)中,除了 0-9 之外,它实际上会匹配来自其他文化的数字。[0-9]\d

于 2013-06-12T19:53:45.750 回答