我有一個使用基於Javascript的規則引擎的應用程序。我需要一種將常規直接引號轉換爲捲曲(或聰明)引號的方法。只需要爲["]
做一個string.replace
就容易了,只有這樣纔會插入一個大寫引號。將「直引號」轉換爲「捲曲引號」
我能想到的最好方法是用左邊的引號替換第一個出現的引號,然後用左邊的引用替換其餘的引號,其餘的都是右邊的引用。
有沒有一種方法可以完成這個使用Javascript?
我有一個使用基於Javascript的規則引擎的應用程序。我需要一種將常規直接引號轉換爲捲曲(或聰明)引號的方法。只需要爲["]
做一個string.replace
就容易了,只有這樣纔會插入一個大寫引號。將「直引號」轉換爲「捲曲引號」
我能想到的最好方法是用左邊的引號替換第一個出現的引號,然後用左邊的引用替換其餘的引號,其餘的都是右邊的引用。
有沒有一種方法可以完成這個使用Javascript?
您可以取代所有preceed單詞字符與左邊的報價,和所有遵循一個正確的報價單詞字符。
str = str.replace(/"(?=\w|$)/g, "“");
str = str.replace(/(?<=\w|^)"/g, "”"); // IF the language supports look-
// behind. Otherwise, see below.
正如下面的評論中指出,這並不需要標點符號在內,但很容易可以:
/(?<=[\w,.?!\)]|^)"/g
[編輯:對於語言不支持look-身後,如JavaScript,只要你第一次全部更換前置的,你有兩個選擇:
str = str.replace(/"/g, "”"); // Replace the rest with right curly quotes
// or...
str = str.replace(/\b"/g, "”"); // Replace any quotes after a word
// boundary with right curly quotes
(我已經離開了origi在上述情況下,最終的解決方案使用不支持向後看語言)
+爲實際回答問題失敗。雖然用戶應該考慮到它在所有情況下都不是完美的 - 例如,表示英尺和英寸的破折號。 – 2010-02-04 20:15:49
...或結尾引語的標點符號。 – Pointy 2010-02-04 20:20:29
謝謝!這是我正在尋找的。一個注意,複製代碼確實給了我一個錯誤。 '?<='部分更改爲'?='。另外,爲了正確匹配,我必須從最後一種情況中刪除引號字符。 代碼: s = s.replace(/「(?= \ w | $)/ g,」「」); s = s.replace(/(?= [\ w, 「)] | ^)」/ g,「」「); – BlueVoid 2010-02-04 20:33:48
'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
return "「" + m1 + "」";
});
這不回答這個問題。 – SLaks 2010-02-04 20:13:07
@SLaks:我編輯它,工作。 – 2010-02-04 20:16:05
它將如何處理'「約翰是6'4」「'? – 2010-02-04 20:18:08
這是有幫助的人,我不認爲像一般這是容易的,因爲你必須準確解讀您的內容中每個雙引號字符的含義。也就是說,我要做的就是收集我感興趣的所有文本節點,然後通讀並記錄每個雙引號實例的「開/關」(或「奇/偶」;無論)性質。然後你可以知道使用哪個替換實體。
您可能想要看看Pandoc的確如此 - 顯然--smart
選項可以在所有情況下正確處理引號(包括例如「tis」和「twere」)。
我最近寫了一個Javascript排版美化引擎,其中包括報價替換;我基本上使用了Renesis建議的算法,但目前還有一項測試失敗,正在等待更智能的解決方案。
如果您有興趣根據您所做的工作挑選我的代碼(和/或提交補丁),請查看:jsPrettify。 jsprettify.prettifyStr
做你正在尋找。如果你不想處理Closure依賴關係,那麼它自己運行一個older version,它甚至可以在Rhino中運行。
加1爲Pandoc。我嘗試使用一個成熟和經過測試的工具,只要我可以對烘烤自己的正則表達式。手工製作的正則表達式不會過於貪婪,或者不夠貪婪,並且它們可能不會對文字邊界和逗號等敏感.Pandoc佔據了大多數這些和更多。 – Paulb 2016-02-27 14:21:23
以下只是交替改變每一個引用(但這個具體的例子將省略孤兒引號)。
str.replace(/\"([^\"]*)\"/gi,"“$1”");
完美的作品,只要文本你增稠尚未與不當使用雙引號的搞砸了。在英語中,引號不會嵌套。
英國有一個合法的情況,這條規則被打破了。如果連續的段落代表同一位發言者引述的發言*,則必須用適當的引號(單,雙,單+雙,雙+單等等)開始每個段落,但一個省略了結束語最後一段由同一位發言者發言。 – tchrist 2010-11-29 05:17:51
謝謝。用PHP做到這一點:http://pastebin.com/CEK0NN43
用JavaScript相反:http://www.kevinkorb.com/post/37
但它從豎直的報價轉換爲捲曲那些在頁面上的問題是,如果轉換完成後,以計算機代碼它通常不工作,所以你必須重新將所有的報價轉換回垂直報價。
我沒有找到我想要的邏輯,所以這就是我最終的目標。
value = value.replace(/(^|\s)(")/g, "$1「"); // replace quotes that start a line or follow spaces
value = value.replace(/"/g, "」"); // replace rest of quotes with the back smart quote
我有一個小的textarea,我需要用捲曲(智能)引號替換直引號。我只是在keyup上執行這個邏輯。我試圖讓它像Microsoft Word一樣行事。
爲後人發帖。
正如@Steven Dee所建議的那樣,我去了Pandoc。
我嘗試使用成熟和經過測試的工具,只要我可以與烘烤自己的正則表達式。手工製作的正則表達式可能過於貪婪,或者不夠貪婪,並且它們可能不會對字的邊界和逗號等敏感。Pandoc佔據了這個和更多。
在命令行(--smart參數開啓智能引號):
pandoc --smart --standalone -o output.html input.html
..和我認識的一個命令行腳本可能會或可能不適合使用Javascript的OP的要求。 (相關:How to execute shell command in Javascript)
您可能想用文字處理器稍微玩一下,看看它使用哪些規則來確定要使用的引號。根據我所看到的,他們基於報價的背景而不是配對。 – 2010-02-04 21:36:26