反引号包裹反引号_五个金色反引号
反引號包裹反引號
五種琴弦
從Java 1.0開始,我們就有了字符串文字"like this" 。 我們還想要其他什么字符串? 其他編程語言為我們提供:
- 表達式插值: s"I am ${age - 10} years old."
- 插值格式: f"Price: $price%8.2f"
- 具有在編譯時檢查的內部語法的字符串: r"[0-9]+([.,][0-9]*)?或xml"<a href='http://java.sun.com'>The Java home page</a>"
- 不轉義反斜杠的原始字符串: raw"\.*"
- 可以包含換行符的多行字符串: """ +-----+ | Cay | +-----+ """
在這里,我使用的語法讓人想起Scala進行演示。 其他語言則做出了不同的選擇。 例如,JavaScript使用反引號進行插值。
我最想在Java中擁有以下哪些功能? 對我而言,這將是編譯時語法檢查。 現在,IDE可以對特定的字符串(例如,正則表達式)進行有根據的猜測,并在格式錯誤時發出警告。 但是,如果它是編譯時錯誤,那就更好了。
當然,這是一個難題。 除了注釋處理,沒有其他機制可以在編譯時添加可插入檢查。 可以提供檢查字符串內容的注釋,而Checker Framework確實可以做到這一點。 但是您注釋變量,而不是字符串文字,因此不是同一回事。
如果有一種進行插值和格式化的標準方法,那也很好。 現在,我們有String.format和MessageFormat.format ,它們都是有用的但不兼容。
相反,Java 12為我們提供了原始/多行字符串。 那也很好
原始字符串
考慮例如使用正則表達式搜索句點。 正則表達式為\. 因為您必須在正則表達式中轉義一個句號。 因此在Java中,它是Pattern.compile("\\.") 。 要匹配反斜杠,它是Pattern.compile("\\\\") 。 這會變得很混亂。
實際上,它是如此令人困惑,以至于JEP 326的作者弄錯了它,或者也許具有微妙的幽默感。 作者的示例是Pattern.compile("\\\"")來匹配" 。 當然,您不需要在正則表達式中進行轉義,因此Pattern.compile("\"")可以正常工作,這證實了所有轉義都是一團糟。
解決方法很簡單。 將字符串括在反引號`...` 。 反引號內的所有內容都無需逃脫: Pattern.compile(`\.`)
但是,如果字符串包含反引號怎么辦?
在Scala和Kotlin中,使用"""分隔符,但這引出了問題。如果字符串包含"""怎么辦?
這是Java設計師提出我以前從未見過的一個聰明的主意。 您可以使用任意數量的反引號開始一個原始字符串,然后使用相同數量的反引號來結束它。 例如,如果您知道您的字符串中沒有五個連續的反引號,請執行以下操作:
String s = `````. . . . . . . . . . . .`````; // Five golden backticks :-)字符串中的所有內容均照原樣進行。 如果它是某些HTML或SQL或您在其他地方開發的任何內容,則將其粘貼。
實際上,“原樣”是一個例外。 即使源文件使用Windows風格的\r\n行尾,所有行尾都被標準化為\n 。
美中不足的蒼蠅
Stephen Colebourne指出,兩個反引號可能會與空字符串混淆。 如果你有類似的東西
s = ``; t = ``;那么就不會將s和t設置為空字符串,而是將s設置為字符串";\nt = " 。
那里有個很好的謎題。
原始字符串不能以反引號開頭或結尾。 例如,假設您要將以下Markdown片段放入Java字符串中:
<
pre>“`
警報(“ Hello,World!”)
警報(“ Hello,World!”)
“
“”`.strip();
strip會在開頭和結尾刪除\n 。 或者,也可以將換行符留在原處,如果它們無關緊要。
( strip方法是Java 11的新功能。它與trim相似,但是它去除了開頭和結尾的Unicode空白,而trim刪除了≤32的字符,這已經不一樣了。這些天,您應該使用strip ,而不是trim 。)
IDE支持
激活JDK 12的實驗功能時,IntelliJ 2018.3可以將帶有反斜杠的字符串轉換為原始字符串。(有關詳細信息,請參閱此博客文章 。)
我嘗試轉換老式的多行字符串:
那是行不通的,但是沒有理由為什么將來不會。
壓痕管理
我更喜歡在最左邊的列上排列多行字符串。 例如,
public static void main(String[] args) {String myNameInABox = ` +-----+ | Cay | +-----+`.strip(); System.out.print(myNameInABox);}它使多行字符串從Java代碼中脫穎而出。 它為您放入原始字符串中的所有內容提供了足夠的水平空間。
但是,很多人似乎更喜歡將多行字符串的內容與Java代碼對齊的樣式:
...String myNameInABox = `+-----+| Cay |+-----+`.align();System.out.print(myNameInABox);align方法(在Java 12中定義)刪除空格的公共前綴以及空白行的開頭和結尾。
這種方法存在風險。 如果混合使用制表符和空格,則每個制表符都計為一個空格。 在您的IDE中,有些東西看起來與您對齊,但與align方法不一致。 當然,您的IDE可能會警告您這種情況。 IntelliJ 2018.3當前不這樣做。
未走的路
關于新功能的許多討論都在“ Amber Spec”郵件列表中進行,您可以在http://mail.openjdk.java.net/pipermail/amber-spec-observers/上進行觀察,因此您可以查看具有哪些替代方法被考慮。
關于是否應該自動刪除縮進進行了激烈的討論。 可以預見,這最終沒有被采納。
原始字符串中的Unicode轉義如何處理? \u0060應該是反引號嗎? 理智盛行,因此決定“原始意味著原始”。
是否應該將兩個反引號定為非法,因為``可能與空字符串混淆? 不可以,只有一個簡單的規則,即“任何一方都有任意數量的反引號”,這一點被認為更為重要。
在開始反引號之后換行怎么樣? 關于是否應該將其剝離存在一些問題。 我仍然感到遺憾的是,沒有對此問題給予更多關注。 將換行符包含在開頭的定界符中將解決兩個問題:初始反引號和最左列的對齊。
我膽怯地問,為什么關閉分隔符不能是“至少與打開分隔符一樣多的反引號”(類似于Scala),以便原始字符串可以以反引號結尾。 不幸的是,我沒有任何回應。
令人驚訝的是,像這樣的概念上簡單的功能有多少細節。 撇開小調,這是一個非常受歡迎的禮物,正好趕上假期。
翻譯自: https://www.javacodegeeks.com/2018/12/five-golden-backticks.html
反引號包裹反引號
總結
以上是生活随笔為你收集整理的反引号包裹反引号_五个金色反引号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业邮箱怎么设置outlook(企业邮箱
- 下一篇: android wtf_WTF连接池