代码之家  ›  专栏  ›  技术社区  ›  Mike Christensen

使用正则表达式将字符串拆分为单词数组

  •  6
  • Mike Christensen  · 技术社区  · 15 年前

    我试图将一个字符串拆分为一组单词,但是我想在每个单词后保留空格。以下是我的尝试:

    var re = /[a-z]+[$\s+]/gi;
    var test = "test   one two     three   four ";
    var results = test.match(re);
    

    我期望的结果是:

    [0]: "test   "
    [1]: "one "
    [2]: "two     "
    [3]: "three   "
    [4]: "four "
    

    但是,每个单词后最多只能匹配一个空格:

    [0]: "test "
    [1]: "one "
    [2]: "two "
    [3]: "three "
    [4]: "four "
    

    我做错什么了?

    5 回复  |  直到 15 年前
        1
  •  9
  •   Kobi    15 年前

    考虑:

    var results = test.match(/\S+\s*/g);
    

    这可以保证你不会错过任何角色(除了开头的几个空格外,但是 \S*\s* 可以解决这个问题)

    您的原始regex显示:

    • [a-z]+ -匹配任意数量的字母(至少一个)
    • [$\s+] -很单一的角色- $ , + 或空白。在这个组后面没有量词,您只匹配一个空格。
        2
  •  2
  •   Motti    15 年前

    尝试以下操作:

    test.match(/\w+\s+/g); // \w = words, \s = white spaces
    
        3
  •  1
  •   codaddict    15 年前

    你正在使用 + 在char类中。试用使用 * 而是在char类之外。

    /[a-z]+\s*/gi;
    

    + char类内部被视为文本 + 而不是作为一个元字符。 使用 * 将捕获可能跟在任何单词后面的零个或多个空格。

        4
  •  0
  •   Felix Kling    15 年前

    这个 + 字面意思是在角色类中。你必须把它移到外面: [\s]+ 或者只是 \s+ ( $ 在类中也没有意义)。

        5
  •  0
  •   palswim    15 年前

    需要更改的regex的基本部分是匹配空白或行尾的部分。

    尝试:

    var re = /[a-z]+($|\s+)/gi
    

    或者,为了 non-capturing groups (我不知道你是否需要这个 /g 标志):

    var re = /[a-z]+(?:$|\s+)/gi