2

假设我有一个类似 的字符串'a b xy c pq',并且我需要编写一个正则表达式,以便该match()方法返回一个数组,比如 this: ['a','b','xy','c','pq']

让我们看一些例子:

>>> 'x y z '.match(/\w{1,3}\s+/g)
['x ', 'y ', 'z ']

>>> 'x y z '.match(/(\w{1,3})\s+/g)
['x ', 'y ', 'z ']

如您所见,即使我添加括号,它也会返回相同的结果。我希望结果没有空格。此外,不必在源字符串中添加结尾空格也很好。

你认为我可以在哪里改进这个正则表达式来得到我想要的?

请注意,我不想使用exec()它,因为它必须运行多次才能获得所有匹配项。

另请注意,这个问题可以很容易地解决split()

>>> 'x y z'.split(/\s/)
['x', 'y', 'z']

>>> "a b xy c pq".split(/\s/)
['a','b','xy','c','pq']

但是,我还需要验证字符串。每个匹配项最多只能包含三个字符,并且每个匹配项应该是一个没有特殊字符的字母数字单词。因此我不能使用split(),因为在这种情况下我必须分别验证每个匹配。我想通过一个正则表达式来完成这一切。

我想在单个正则表达式中进行验证和拆分的原因是因为我需要在一个事件中做很多这些,因此我需要尽可能快地完成它。

4

2 回答 2

2

通过附加\s+,该模式匹配空格字符。

删除\s+

'x y z '.match(/\w{1,3}/g)
// => ["x", "y", "z"]

使用\b,您可以匹配单词边界。

'x y z '.match(/\b\w{1,3}\b/g)
// => ["x", "y", "z"]
'x yyyyyyyyyy z '.match(/\b\w{1,3}\b/g)
// => ["x", "z"]
于 2013-10-10T14:16:38.920 回答
0

正则表达式:/(?!.*?\w{4,}.*?)\b\w{1,3}\b/g似乎对我有用

var tests = ['x y z ','a b xy c pq','x y abcdefgh ','abc d rar','rawr'];

for(var i=0,c=tests.length;i<c;i++)
{
    var str = tests[i];
    console.log(str.match(/(?!.*?\w{4,}.*?)\b\w{1,3}\b/g));
}

/*
Results:

["x", "y", "z"]
["a", "b", "xy", "c", "pq"]
null
["abc", "d", "rar"]
null
*/
于 2013-10-10T19:15:26.117 回答