反引号包裹反引号

五种琴弦

从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.formatMessageFormat.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 = ``;

那么就不会将st设置为空字符串,而是将s设置为字符串";\nt = "

那里有个很好的谜题。

原始字符串不能以反引号开头或结尾。 例如,假设您要将以下Markdown片段放入Java字符串中:

<

pre>“`
警报(“ Hello,World!”)

</pre>
You obviously can't add backticks at the start, so the best thing you can do is add a space or newline before the <code>```</code>. And the same holds for the end. Java requires that the ending delimiters exactly match the start. (In contrast, in Scala, you can write <code>"""Hello, "World""""</code>, and the compiler figures out that one of the terminal quotation marks belongs to the string.)So, you can write:
<pre>String markdown = `````

警报(“ Hello,World!”)

“”`.strip();

strip会在开头和结尾删除\n 。 或者,也可以将换行符留在原处,如果它们无关紧要。

strip方法是Java 11的新功能。它与trim相似,但是它去除了开头和结尾的Unicode空白,而trim删除了≤32的字符,这已经不一样了。这些天,您应该使用strip ,而不是trim 。)

IDE支持

激活JDK 12的实验功能时,IntelliJ 2018.3可以将带有反斜杠的字符串转换为原始字符串。(有关详细信息,请参阅此博客文章 。)

我尝试转换老式的多行字符串:

private static final String authorPublisherQuery = "SELECT Books.Price, Books.Title\n"+ " FROM Books, BooksAuthors, Authors, Publishers\n"+ " WHERE Authors.Author_Id = BooksAuthors.Author_Id AND BooksAuthors.ISBN = Books.ISBN\n"+ " AND Books.Publisher_Id = Publishers.Publisher_Id AND Authors.Name = ?\n"+ " AND Publishers.Name = ?\n";

那是行不通的,但是没有理由为什么将来不会。

压痕管理

我更喜欢在最左边的列上排列多行字符串。 例如,

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

反引号包裹反引号

反引号包裹反引号_五个金色反引号相关推荐

  1. 单引号oracle如何转义_浅谈oracle中单引号转义

    ORACLE 单引号转义: 在ORACLE中,单引号有两个作用: 1:字符串是由单引号引用 2:转义. 单引号的使用是就近配对,即就近原则.而在单引号充当转义角色时相对不好理解 1.从第二个单引号开始 ...

  2. 微信小程序反编译wxss文件缺失_微信小程序反编译~2020年

    摘要 安装wxappUnpacker小程序反编译工具并使用(2020.03) 关键词: 微信小程序反编译 wxss 介绍 上次分享了web前端爬取工具 ,那么这次也同样讲讲微信小程序反编译吧,对于像博 ...

  3. java反编译微信小程序_微信小程序反编译的实现

    首先声明:本文章仅供学习之用,不可它用. 一.前言 看到人家上线的小程序的效果,纯靠推测,部分效果在绞尽脑汁后能做出大致的实现,但是有些细节,费劲全力都没能做出来.很想一窥源码?查看究竟?看看大厂的前 ...

  4. python三引号怎么打出来_请问python中的三引号怎么打啊?小白求助

    第一中方法比较简单,直接使用三个反斜杠进行转义,也就是: print("\"\"\"");因为\"代表一个引号,那么连续三个\"自 ...

  5. 五种 Ajax 反模式:避免常见的 Ajax 代码陷阱!

      developerWorks 中国  >  XML | Web development  > Ajax 和 XML: 五种 Ajax 反模式 避免常见的 Ajax 代码陷阱 文档选项 ...

  6. Scrapy 爬虫框架五—— 常见的反爬虫技术

    爬虫的本质就是"抓取"第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫.比如前面介绍的通过 User-Agent 请求头验证是否为浏览器.使用 J ...

  7. java反编译工具_安卓逆向之反编译工具的使用

    SMALI/BAKSMALI是一个强大的apk文件编辑工具,用于Dalvik虚拟机(Google公司自己设计用于Android平台的虚拟机)来反编译和回编译classes.dex.其语法是一种宽松式的 ...

  8. 金蝶软件怎么过账_金蝶专业版怎么反过账

    1.进入主界面 2.同时按下ctrl+F11键-勾选"部分凭证反过账",如果是要全部反过账就可以不选 3.设置要反过账凭证字号,日期-完成 4.完成反过账后,回到凭证查询模块查找已 ...

  9. 金蝶专业版怎么反过账当月_金蝶专业版怎么反过账

    金蝶专业版怎么反过账 1.进入主界面 2.同时按下ctrl+F11键-勾选"部分凭证反过账",如果是要全部反过账就可以不选 3.设置要反过账凭证字号,日期-完成 4.完成反过账后, ...

最新文章

  1. 【GoLang】GoLang GOPATH 工程管理 最佳实践
  2. 测量150kHz接收电路的主要的一些特性:扫频,线性,工作电压影响
  3. mysql 值到99999后不增值了_Mysql 增加新数据,若存在则更新的问题
  4. 如何优化android内存,Android内存优化
  5. c#仿照qq登录界面编辑框内容操作
  6. WPF跨程序集共享样式(跨程序集隔离样式和代码)
  7. javascript 中文帮助文档_我的《ANSA快速入门指南》中文帮助文档浅析(上)
  8. 多线程编程学习笔记——线程池(二)
  9. Ubuntu下对executable (application/x-executable)文件创建快捷方式
  10. Linux 虚拟机忘记密码解决办法
  11. 【笔记】运营如何追求极致--混沌大学(抖音分享)
  12. xpath的常见操作
  13. 为什么linux中权限r对应4、w对应2、x对应1
  14. 尚德机构第四季度营收5.688亿元 亏损大幅缩小
  15. php substr 中文_php substr中文截取乱码解决办法
  16. 2022年新年焰火代码
  17. labelImg 免命令安装(Windows)
  18. OSPF邻居震荡抑制
  19. 若不用计算机tan35 怎么算,三角函数计算器-三角函数计算器
  20. 第六章 从信息互联网到价值互联网 [27]

热门文章

  1. CodeForces - 1189A ----Keanu Reeves
  2. Panasonic Programming Contest (AtCoder Beginner Contest 195) 题解
  3. YbtOJ-森林之和【dp】
  4. YbtOJ#20070-[NOIP2020模拟赛B组Day5]诗人小K【状压dp】
  5. P4981-父子【数学,树】
  6. 【DP】【容斥】Nice to Meet You(AT3634)
  7. 【贪心】国王游戏(ybtoj 贪心-1-4)
  8. 洛谷-P1903 数颜色 分块 bitset
  9. 2017西安交大ACM小学期 敏感词汇[AC自动机]
  10. Flowable学习笔记(一、入门)