我想写regexp,可以通过空格分割指定的字符串,但不包含一些特殊的符号(引号和括号)。对于以下字符串:
127.0.0.1 - - [16/Jun/2015:01:21:01 +0300] "GET /status.xsl HTTP/1.1"
我需要得到以下答案:
匹配所有引用的字符串很简单:"([^"]+)"
,括号\[([^\]]+)\]
匹配所有非空格字符很简单:\S+
由于这些条件,我很困惑。是否可以使用一个正则表达式执行此类操作?或者我应该使用不同的方法来执行此操作?
答案 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));