2014-06-05 16 views
2

我目前正在建造一個小自定義文件格式的文本編輯器。我有一個GUI,但我也實現了一個小型輸出控制檯。我想要實現的是添加一個非常基本的輸入字段來執行一些命令並傳遞參數。 的命令看起來像:分割空間避免雙引號的JS字符串:從'a'b \「c」d'到['a',''b \「c」','d']

compile test.json output.bin -location "Paris, France" -author "Charles \"Demurgos\""

我的問題是使包含空格分隔的參數,但保留這可能是由JSON.stringify生成字符串中的雙引號部分的Array包含轉義雙引號內。

需要明確的是,爲前一個命令的預期陣列是:

[ 
    'compile', 
    'test.json', 
    'output.bin', 
    '-location', 
    '"Paris, France"', 
    '-author', 
    '"Charles \\"Demurgos\\""' 
] 

然後,我可以在這個數組迭代和應用JSON.parse如果indexOf('"') == 0得到最終的結果是:

[ 
    'compile', 
    'test.json', 
    'output.bin', 
    '-location', 
    'Paris, France', 
    '-author', 
    'Charles "Demurgos"' 
] 

感謝這個問題:Split a string by commas but ignore commas within double-quotes using Javascript。如果參數不包含任何雙引號,我就能得到我所需要的。下面是我得到的正則表達式:

/(".*?"|[^"\s]+)(?=\s*|\s*$)/g

但它退出當前參數的時候遇到一個雙引號,即使是逃跑。我該如何適應這個RegEx來關心轉義或不轉義的引號?如果我提示action "windowsDirectory\\" otherArg,那麼邊緣情況如何,這裏反斜槓已經被轉義了,所以即使後面跟着雙引號,它也應該退出參數。 這是一個我在之前的項目中儘量避免的問題,但我覺得是時候學習如何正確使用低於帳戶的轉義字符。

這裏是一個JS小提琴:http://jsfiddle.net/GwY8Y/1/ 你可以看到,開始是很好的解析,但最後的參數是拆分和錯誤。

謝謝你的幫助。

回答

2

此正則表達式會給你你需要的字符串(見demo):

"(?:\\"|\\\\|[^"])*"|\S+ 

使用方法如下:

your_array = subject.match(/"(?:\\"|\\\\|[^"])*"|\S+/g); 

解釋的正則表達式

"      # '"' 
(?:      # group, but do not capture (0 or more times 
         # (matching the most amount possible)): 
    \\      # '\' 
    "      # '"' 
|      # OR 
    \\\\     # two backslashes 
|      # OR 
    [^"]     # any character except: '"' 
)*      # end of grouping 
"      # '"' 
|      # OR 
\S+      # non-whitespace (all but \n, \r, \t, \f, 
         # and " ") (1 or more times (matching the 
         # most amount possible)) 
+0

@Demurgos嘿Demurgos,這對你的問題有幫助嗎?還是你還在摔跤呢?謝謝你讓我知道。 :) – zx81

+0

對不起,今天早上我有一個奇怪的錯誤,只能通過代理訪問堆棧溢出。首先:謝謝,它工作正常......但在最後一段我討論的最後一個案例中失敗了:如果字符串以奇數個反斜槓結尾,那麼它們正在逃避自己,雙引號應該是一個結束雙引號,但在這裏它忽略了,因爲逃避反斜線。我試圖用http://tinyurl.com/p2k32ty修復它,但它沒有JS中的「lookbehind」失敗。這裏是越野車字符串:http://regex101.com/r/dG5yE6 – Demurgos

+0

@Demurgos Ha,一個新案例。 :)我編輯了答案(請參閱新的[演示](http://regex101.com/r/cA7kY1))請讓我知道,如果這對你有用。 :) – zx81

相關問題