热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

五金手册_五金反引号

五金手册五种琴弦从Java1.0开始,我们就有了字符串文字likethis。我们还想要其他什么字符串?其他编程语言为我们提供:表达式插
五金手册

五金手册

五种琴弦

从Java 1.0开始,我们就有了字符串文字"like this" 。 我们还想要其他什么字符串? 其他编程语言为我们提供:

  • 表达式插值: s"I am ${age - 10} years old."
  • 插值格式: f"Price: $price%8.2f"
  • 具有在编译时检查的内部语法的字符串: r"[0-9]+([.,][0-9]*)?xml"The Java home page"
  • 未转义反斜杠的原始字符串: 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!”)


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

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

五金手册



推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
上床后悔_155
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有