2015-09-02 126 views
1

問題

假如你有一個包含一個或多個隨機的字符序列或詞由某個字符被分隔字符串之間的字符和轉義字符本身,可以說,一個單引號。不是分隔符的單引號會被反斜槓轉義。匹配逃脫分隔符

例如:

字符串

'字' '字的字' '字\' 單詞 ' '\' '\\' '\''

想要的捕捉

  1. '字'
  2. '逐字逐句'
  3. '字\' 字 '
  4. '\'
  5. '\\'
  6. '\''

本質必須捕獲非轉義單引號之間的每個字符序列。

困難

捕獲#4和#5兩者都具有單引號定界符由反斜槓轉義。實際上,這應該只是單引號分隔符之間的反斜槓。

到目前爲止,我已經能夠捕獲除#6之外的所有東西。我用正則表達式如下:

'((\\'[^ \ s] | [^ '])*)'

我發現這相當奇怪,因爲我認爲這將捕捉每一個不包含單引號的單引號之間的字符序列,除了單引號後面跟非空白字符。所以我不知道爲什麼#6沒有被這個表達式捕獲。

回答

0

基本上你需要匹配的是不是一個引號中的所有字符或任何字符用反斜槓(包括單引號或反斜槓本身)進行轉義:

'((?:[^'\\]|\\.)*)' 

爲了使這一模式高效,你可以重寫它像這樣(不交替):

'([^\\']*(?:\\.[^\\']*)*)' 
+0

我做了一個快速測試,但我不認爲這是正確的解決方案:http://regexr.com/3bmtc 。或者這個測試錯了嗎?如果我也避免了反斜槓本身,那麼你的解決方案就可以工作,這很有道理。 – Pascal

+0

@帕斯卡爾:爲了更加清楚,我認爲你期望的結果是錯誤的。 (特別是第4項必須是'''') –

+0

我認爲你是對的。我想我被隧道視線所困住了。感謝您解決這個問題。我會接受這個答案。 – Pascal

0
'(?:[^'\\]|\\'(?!\s))*'|'\\+' 

您可以使用它來代替。請參閱演示。

https://regex101.com/r/sS2dM8/35

+0

這解決了這個具體的例子,但沒有抓住三個或更多的反斜槓betwee正如在最初的問題中提到的那樣。請注意,我希望它能夠捕獲單引號之間的每個字符序列(單引號不是分隔符轉義) – Pascal

+0

@Pascal檢查編輯 – vks

+0

我印象深刻。不過,我認爲通過正確轉義字符來解決此問題會更好。仍然+1您的答案。 – Pascal