2015-10-23 60 views
0

我想編寫正則表達式,可以通過空格拆分指定的字符串,但不包含某些特殊符號(括號內爲引號&)。對於下面的字符串:如何將字符串按空格拆分,即不包含指定字符?

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月/ 6/2015:01: 21:01 +0300
  4. GET /status.xsl HTTP/1.1

它是簡單的匹配所有引用的字符串:"([^"]+)",同爲支架\[([^\]]+)\]

它是簡單的匹配所有非空格字符:\S+

我是因爲這些條件困惑。是否可以用一個正則表達式來執行這樣的操作?或者我應該使用不同的方法來執行此操作?

+0

你能不使用csv分析器? – Fuser97381

+0

有沒有必要擺脫括號?即你曾經有過例如一個字符串包含「[」 –

+1

你不能只匹配字符串,而不是分裂?這將使這更容易。 –

回答

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)); 
 

1

這並不完全符合您的要求,但在解析Web訪問日誌時,您可能會預先考慮某些模式。

對於您的情況,2或3個「已知」假空格位於日期的時區之前,URL的HTTP操作之後和HTTP版本之前。

例如URL之前的「GET」(或POST,PUT ...)之後的空格是已知空間,但不是各個值之間的分隔符。如果您首先將所有出現的"GET替換爲"GET{FAKE_SPACE}並將時區:01 +0300(比如/(:\d\d)(\s)/)替換爲空格,那麼您可以將剩餘的空格分隔開,然後獲得所需的項目。 (當然,你會想要恢復{FAKE_SPACE}令牌)

2

試試這個。

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

將處理與兩個領域包裹在[]中的行?由於這兩個字段之間的每個空間都在[和] –

+0

之間,我相信它會,[]是第一個,應該先解決。 我在這裏測試過。 http://regexpal.com/ –

相關問題