【问题标题】:How to split string by space, that is not wrapped by specified characters?如何按空格分割字符串,不被指定字符包裹?
【发布时间】:2015-10-23 13:35:36
【问题描述】:

我想编写正则表达式,可以通过空格分割指定的字符串,这些字符串没有被一些特殊符号(引号和括号)包裹。对于以下字符串:

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

匹配所有带引号的字符串很简单:"([^"]+)",括号\[([^\]]+)\]也一样

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

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

【问题讨论】:

  • 你不能使用 csv 解析器吗?
  • 是否需要转义括号?即,您是否曾经有过包含“[” 的字符串
  • 你不能只匹配字符串而不是拆分吗?这样会更容易。
  • 通过捕获组使用正则表达式真的很容易。但是,模式会很长。
  • @TimB 不,不需要转义括号或引号

标签: javascript regex string


【解决方案1】:

试试这个。

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

【讨论】:

  • 会处理包含在 [] 中的两个字段的行吗?因为这两个字段之间的每个空格都在 [ 和 ] 之间
  • 我相信会的,[] 是第一位的,应该首先解决。我在这里测试了它。 regexpal.com
【解决方案2】:

如果您提供更多输入示例,可以改进答案,同时如果您想尝试另一种方法,您可以使用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));
   

【讨论】:

    【解决方案3】:

    这并不完全是您所追求的,但是在解析 Web 访问日志时,您可能可以预先考虑某些模式。

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2021-10-05
      相关资源
      最近更新 更多