2014-09-21 34 views
1

我一直在搜索,瀏覽stackoverflow正則表達式解決方案,直到我眼鏡蛇。正則表達式幫助 - 嵌入報價字符串中的雙引號

我有一個第三方解決方案提供了一個「製表符分隔的文本文件」,但我已經確定了生成這個文件的任何東西是嵌入雙引號(甚至沒有轉義它們) - 我想知道它的可能性使用RegEx從文件中清除這些錯誤(我在導入之前在文件上使用FNR)。

每行數據包含14列,製表符分隔,每個字段周圍都有雙引號,如預期的那樣。所有的缺陷發生在第2場或第10場(不是第一場或最後一場),因爲這些都是訓練課程 - 一些教練使用名稱中帶有雙引號的名字 - 而這份第三方報告並沒有逃避它們。我希望之前和正確的引號後趕上TAB - 和過濾任何內部錯誤雙引號或者\正確轉義」

"......" "ADC000000" "Being the "Best" you can be" "2F8A776C" "...." 
"......" "BBC555555" ""Golden Opportunity"" "8F4C3DEE" "...." 

所需的輸出

"......" "ADC000000" "Being the \"Best\" you can be" "2F8A776C" "...." 
"......" "BBC555555" "\"Golden Opportunity\"" "8F4C3DEE" "...." 

或(取是最簡單的,並且相當快的文件中都有22萬行,只有16-50錯誤)

"......" "ADC000000" "Being the Best you can be" "2F8A776C" "...." 
"......" "BBC555555" "Golden Opportunity" "8F4C3DEE" "...." 

遺憾的這個冗長,但我想這個問題是因爲possi清晰BLE。

回答

1

您可以使用下面的正則表達式來匹配",這些標記或行的開頭不是前面的,也不是後跟標籤或行結束符。

(?<!\t|^)"(?!\t|$) 

然後更換\\"匹配"

DEMO

+0

非常感謝Avinash的快速響應,這看起來非常接近 - 但也在每行的開頭和結尾都選擇了引號。有沒有辦法避免匹配這些情況? – RLW 2014-09-21 12:59:12

+0

不,你看過上面的演示嗎? – 2014-09-21 13:01:06

+0

我可能說話太快了,我正在使用debuggex.com嘗試自己弄清楚 - 但我遵循了你的演示鏈接,它沒有這個問題。請給我一點時間來弄清楚如何將這些信息提供給FNR。 – RLW 2014-09-21 13:27:21

0

可以匹配不是選項卡的任何引用,既之前和之後的字符:

s/([^\t])"([^\t])/$1\\"$2/g 

(的$ 1和$ 2將匹配之前和之後的字符後面的取代的字符串中的精確語法可能這取決於你的正則表達式引擎會發生變化)

如果您正則表達式引擎支持它,你可以使用回顧後和預讀,使之簡單一點:

s/(?<!\t)"(?!\t)/\\"/g 
+0

FNR顯然使用每個文檔的.NET RegEx,與Perl 5 RegEx類似。哪個引擎使用這種s// g格式,也許我可以將它轉換爲Perl並嘗試它。 – RLW 2014-09-21 13:07:07

+0

's /(PATTERN)/(REPLACEMENT)/ g'是Perl用於搜索正則表達式(PATTERN)並用「(REPLACEMENT)」代替它的符號 - 這樣就相當於調用例如'replace(string,'(PATTERN)','(REPLACEMENT)')'。 (末尾的'g'表示使用字符串中的所有匹配項,而不僅僅是第一個。) – ptomato 2014-09-21 20:04:50

+0

感謝您的澄清。我不能滿足你的答案(我猜想對於論壇來說太新了),但是如果我使用純Perl(而不是FNR,它具有單獨的查找和替換輸入),這就是我所需要的。 – RLW 2014-09-22 12:52:01

0

拆分的選項卡,然後去掉開頭和結尾的報價:

line.split('\t').map(function(field) { return field.replace(/^"|"$/, ''); }) 

在一般情況下,人們似乎正在試圖做太多的正則表達式,可以用其他方法來更容易地完成如分割和掃描。

+0

我肯定有罪,試圖用RegExp做些事情,如果我運行某種類型的處理腳本,可能會有更好的解決方案。 ,正確嗎?也許我的時間最好花在學習一個非常好的字符串操作語言 - 我可以從Windows批處理運行 - 它是Python嗎? – RLW 2014-09-21 12:56:37

+0

如果是Python,則必須添加Python標記(以上是JS,對不起)不管怎麼說,不需要一個字符串操作語言來分割和匹配字符串,所有的語言都有這些能力。你花時間學習你正在編寫的語言是最好的。 – 2014-09-21 12:59:24