2011-01-13 70 views
1

請幫我解決我的問題。 我有以下字符串列表:需要正則表達式來關閉或替換引號

a 
"b 
c" 
"ddd" 
'ee' 
a"b"c 
a'b'c 

結果我需要:

"a" 
"b" 
"c" 
"ddd" 
"ee" 
"a\"b\"c" 
"a'b'c" 

請幫我寫的替換模式。

+6

KISS修剪'結束'然後做一個簡單的字符串替換```。最後把它包裝在`「...」中。 – leppie 2011-01-13 13:23:24

+3

它是否必須是RegEx?看起來像使用常規字符串操作很簡單。 – Oded 2011-01-13 13:23:37

+0

太慢@Oded; P(全部13秒) – leppie 2011-01-13 13:24:16

回答

1

不知道C#語法,但我認爲你應該通過三個簡單的步驟來分割它。

對於每個字符串: - 剝離開始和結束報價(如果有的話)。 - 轉義字符串。 - 添加開始和結束報價。

應該很容易實現。

3

正如其他人已經在評論中指出的那樣:這不是正則表達式的工作。事實上,如果你嘗試這樣做,你會得到的代碼是,而不是簡單的想法,可讀性和可維護性要低於

string.Concat("\"", myString.Trim('"', '\'').Replace("\"","\\\""), "\""); 

PowerShell的測試:

PS Home:\> filter fixString { '"' + $_.Trim('"', "'").Replace('"', '\"') + '"' } 
PS Home:\> 'a','"b','c"','"ddd"',"'ee'",'a"b"c',"a'b'c" | fixString 
"a" 
"b" 
"c" 
"ddd" 
"ee" 
"a\"b\"c" 
"a'b'c" 

但是,如果你迫切需要的正則表達式,我能想到的只有以下三個單獨更換的:

myString = Regex.Replace(myString, @"^['""]|['""]$", ""); 
myString = Regex.Replace(myString, @"""", @"\"""); 
myString = Regex.Replace(myString, "^|$", @""""); 

PowerShell的測試:

PS Home:\> 'a','"b','c"','"ddd"',"'ee'",'a"b"c',"a'b'c" | 
>> % { $_ -replace '^[''"]|[''"]$' -replace '"','\"' -replace '^|$','"' } 
"a" 
"b" 
"c" 
"ddd" 
"ee" 
"a\"b\"c" 
"a'b'c" 

只有兩個正則表達式下面的作品,感謝Toader Mihai Claudiu誰提供了一些重要的建議:

myString = Regex.Replace(@"^['""]?(.*?)['""]?$", @"""$1"""); 
myString = Regex.Replace(@"(?<=.)""(?=.)", @"\"""); 

PowerShell的測試:

PS Home:\> 'a','"b','c"','"ddd"',"'ee'",'a"b"c',"a'b'c" | 
>> % { $_ -replace '^[''"]?(.*?)[''"]?$','"$1"' -replace '(?<=.)"(?=.)','\"' } 
"a" 
"b" 
"c" 
"ddd" 
"ee" 
"a\"b\"c" 
"a'b'c" 

現在問自己:你還會知道代碼做的是什麼一個月後?一年也許?

1

你應該手動做。在緩衝區中添加一個「,跳過字符串中的第一個字符,如果"'加入每個非",因爲它是緩衝區並引用每個"(也就是將其轉換爲\")。最後(不要加引號"直到你有下一個字符比"不同)只需添加引用"非,如果最後一個字符是"'

你可以也許2正則表達式搜索做到這一點和替換,但它更有效地做到這一點如上