反引号包裹反引号_五个金色反引号

反引号包裹反引号

五种琴弦

从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

反引号包裹反引号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言iota怎么用,C++ std::iota用法及代码示例

存储顺序递增分配val的[first&#xff0c;last]个连续值范围内的每个元素&#xff0c;就像在写入每个元素之后以 val递增。模板&#xff1a;void iota (ForwardIterator first, ForwardIterator last, T val);参数&#xff1a;first, lastForward iterators to the initial and…

web自动化如何在不同浏览器运行_自动化决策环节的“心脏”将如何与众不同?...

原标题&#xff1a;自动化决策环节的“心脏”将如何与众不同&#xff1f;原宝钢研究院首席研究员郭朝晖博士认为&#xff1a;自动化本质是感知、决策和执行的统一自动化的理论基础是控制论。控制论诞生时&#xff0c;控制论之父维纳思考了这样一个问题&#xff1a;机器和人(动物…

Servlet中获取请求头的数据

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取请求头的数据** author liaowenxiong* date 2021/12/29 11:21*/ import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.ut…

jdk8 :: 什么意思_JDK 13:什么是AggressiveOpts?

jdk8 :: 什么意思JVM 11中已弃用Java VM标志-XX:AggressiveOpts [请参见JDK-8199777和JDK-8199778 ]“因为其行为是不明确的。” JDK-8199778的“问题”部分进一步解释了&#xff08;我强调了 &#xff09;&#xff1a; AggressiveOpts已被用作实现各种实验性能功能的一种包罗…

c语言递归函数检测回文,在C中使用递归函数的回文测试

我试图编写用于测试字符串的程序&#xff0c;如果它是回文或不是&#xff0c;但我总是得到输出&#xff0c;因为它不是一个。我的代码有什么问题&#xff1f;在C中使用递归函数的回文测试#include #include int is_palindrome(int start, int end, char *str){if (str[start] !…

获取macos mojave_高仿MacOS教程

“潮办公”关注我们拥有一台MacBook是很多人的梦想&#xff0c;但是高昂的售价成功逼退了一大波人。MacBook一直以颜值高、轻薄、系统流畅而出名&#xff0c;那么其他的小伙伴们想体验一波苹果系统怎么办&#xff1f;这个软件或许能帮你。Part 1安装Mydockmydock是windows下的一…

Servlet中防止盗链的代码

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取referer&#xff0c;防止盗链** author liaowenxiong* date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpSer…

android wtf_WTF连接池

android wtf让我们谈谈连接池。 我声称&#xff1a; 大多数流行的连接池的默认设置都很差&#xff01; 对您来说&#xff0c;这意味着&#xff1a; 去查看您的连接池设置。 如果您依赖默认设置&#xff0c;则可能会遇到问题。 您可能有内存泄漏和应用程序无响应&#xff08…

c语言实验5上机刘若慧2017年,《《 C语言程序设计案例教程》》.ppt

《《 C语言程序设计案例教程》》.ppt课堂练习&#xff1a; 7、求三个整数之和&#xff1a; 1 只用main函数 2 用求两个整数之和的函数实现 main int a, b, c, sum; scanf “%d, %d,%d”, &a, &b, &c &#xff1b; sum abc; printf “sum %d\n”,sum ; printf “%d%…

c++ vs 输出log到窗口_欧冠豪门碰撞,尤文vs巴萨,曼联vs红牛

点击上方蓝色字关注我们 “ 欧冠第二轮昨日完成8场比赛&#xff0c;3胜3平2负&#xff0c;各队保平争胜策略明显。今日各豪门再出发&#xff0c;竞彩推出4场热门比赛。热门014尤文vs巴萨&#xff0c;015曼联vs莱比锡红牛。”01—周三014 欧冠 尤文图斯vs巴塞罗那 2020-10-29 04…

Servlet中判断浏览器版本的代码

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取user-agent&#xff0c;判断浏览器版本** author liaowenxiong* date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.htt…

jakarta ee_在等待Jakarta EE时

jakarta ee自Oracle在JavaOne 2017宣布将Java™EE转移到Eclipse Foundation以来已有一年多了。此后&#xff0c;发生了很多事情&#xff1a; Java™EE 8 API和实现项目已在EE4J下建立 。 Eclipse GlassFish 5.1 即将发布 。 全新的Jakarta EE规范流程指日可待。 社区显示出…

c语言解析分隔符文本,c – 使用分隔符读取文件

正如其他两个答案所指出的那样,你必须使用std :: getline,但这就是我要做的&#xff1a;if (std::getline(is, zipcode, ,) &&std::getline(is, city, ,) &&std::getline(is, state)){d.zipCode std::stoi(zipcode);}我做的唯一真正的改变是我将提取包含在if语…

很高兴加入 英文_XR车载公司Holoride加入高通XR计划

原标题&#xff1a;XR车载公司Holoride加入高通XR计划XR车载公司Holoride进来了高通的Qualcomm XR Eneerprise决策 你大约没有听说过holoride&#xff0c;但你势必听说过高通公司。下面我们就来看看Holoride&#xff0c;他是一家确立两年的XR车载公司&#xff0c;起劲于提供家用…

Servlet中获取请求体的数据

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取请求体的数据** author liaowenxiong* date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import ja…

go语言var 和make_Var和语言设计

go语言var 和makeJava中的var是什么 在Java 10中引入的var预定义类型使您可以在为变量分配值时声明局部变量&#xff0c;而无需指定变量的类型。 当给变量赋值时&#xff0c;表达式的类型已经定义了变量的类型&#xff0c;因此没有理由在行的左侧再次键入类型。 例如&#xff0…

c语言每次堆的变化是1k,DSPXC语言+程序烧写讲述.ppt

DSPXC语言程序烧写讲述* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 第2.5节 DSP程序烧写 第2.5节 DSP程序烧写 第2.5节 DSP程序烧写 注意事项: 电路元件初始化同步问题&#xff1a;由于外…

众智日照分析软件_飞时达CAD日照分析计算软件FastSUN V14.0.1发布升级

2020-7-13&#xff0c;正式对外发布飞时达日照分析软件FastSUN V14.0.1(32/64)&#xff0c;本次为小版本升级发布。温馨提醒&#xff1a;本次升级以安装包更新的方式发行&#xff0c;原14.0版本不需要卸载可直接覆盖安装本更新安装包14.0.1。飞时达日照分析软件FastSUN V14.0.1…

高频变压器_变压器图案

高频变压器Transformer模式是Java&#xff08;以及可能仅具有使用场所差异和不变参数类型的其他OO语言&#xff09;的设计模式&#xff0c;可帮助子类型层次结构内的对象将自己流畅地转换为任何类型的对象。 语境 我一直在关注与Jim Laskey发行的JDK-8203703有关的OpenJDK线程…

linux文件 run.man,【Linux】linux经常使用基本命令

Linux中很多经常使用命令是必须掌握的&#xff0c;这里将我学linux入门时学的一些经常使用的基本命令分享给大家一下&#xff0c;希望能够帮助你们。这个是我将鸟哥书上的进行了一下整理的&#xff0c;希望不要涉及到版权问题。1、显示日期的指令&#xff1a; date2、显示日历的…