如何按空格分割字符串,不包含指定的字符?

时间:2015-10-23 13:35:36

标签: javascript regex string

我想写regexp,可以通过空格分割指定的字符串,但不包含一些特殊的符号(引号和括号)。对于以下字符串:

127.0.0.1 - - [16/Jun/2015:01:21:01 +0300] "GET /status.xsl HTTP/1.1"

我需要得到以下答案:

  1. 127.0.0.1
  2. -
    • -
  3. 16 / Jun / 2015:01:21:01 +0300
  4. GET /status.xsl HTTP / 1.1
  5. 匹配所有引用的字符串很简单:"([^"]+)",括号\[([^\]]+)\]

    相同

    匹配所有非空格字符很简单:\S+

    由于这些条件,我很困惑。是否可以使用一个正则表达式执行此类操作?或者我应该使用不同的方法来执行此操作?

3 个答案:

答案 0 :(得分:2)

试试这个。

\"([^\"]+)\"|\[([^\]]+)\]|([^ ]+)

答案 1 :(得分:1)

这不是你想要的,但在解析网络访问日志时,你可能会预先考虑某些模式。

在您的情况下,2或3个“已知”假空格位于日期的时区之前,URL的HTTP操作之后以及HTTP版本之前。

e.g。 URL之前的“GET”(或POST,PUT ...)之后的空格是已知空间,但不是各个值之间的分隔符。如果您首先将所有"GET替换为"GET{FAKE_SPACE},并将时区:01 +0300替换为/(:\d\d)(\s)/(先说{FAKE_SPACE}),那么您可以将剩余的空格和空格分开有你想要的项目。 (当然,你会想要恢复iTime令牌)

答案 2 :(得分:1)

如果您提供更多输入示例,则可以优化答案,与此同时,如果您想尝试其他方法,可以使用split()



input = '127.0.0.1 - - [16/Jun/2015:01:21:01 +0300] "GET /status.xsl HTTP/1.1"';

results = input.split(/(?=[-\[\]"])[" \]\[]|[ "\[\]](?=[-\[\]"])/).filter(function(e){ return e === 0 || e });

document.write(JSON.stringify(results));