精华内容
下载资源
问答
  • 反引号包裹反引号 五种琴弦 从Java 1.0开始,我们就有了字符串文字"like this" 。 我们还想要其他什么字符串? 其他编程语言为我们提供: 表达式插值: s"I am ${age - 10} years old." 插值格式: f"Price: $...

    反引号包裹反引号

    五种琴弦

    从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

    反引号包裹反引号

    展开全文
  • tag `string text ${expression} string text` 描述 模板字符串使用反引号 () 来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法(${expression})的占位符。占位符中的表达式和周围的文本会一起...

    模板字面量 是允许嵌入表达式的字符串字面量。

    你可以使用多行字符串和字符串插值功能。它们在ES2015规范的先前版本中被称为“模板字符串”。

    语法

    `string text`

    ?

    `string text line 1

    string text line 2`

    ?

    `string text ${expression} string text`

    ?

    tag `string text ${expression} string text`

    描述

    模板字符串使用反引号 () 来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法(${expression})的占位符。占位符中的表达式和周围的文本会一起传递给一个默认函数,该函数负责将所有的部分连接起来,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以通过该函数来对模板字符串进行操作处理。在模版字符串内使用反引号(`)时,需要在它前面加转义符(\)。

    `\`` === "`" // --> true

    多行字符串

    在新行中插入的任何字符都是模板字符串中的一部分,使用普通字符串,你可以通过以下的方式获得多行字符串:

    console.log(‘string text line 1\n‘ +

    ‘string text line 2‘);

    // "string text line 1

    // string text line 2"

    要获得同样效果的多行字符串,只需使用如下代码:

    console.log(`string text line 1

    string text line 2`);

    // "string text line 1

    // string text line 2"

    插入表达式

    在普通字符串中嵌入表达式,必须使用如下语法:

    var a = 5;

    var b = 10;

    console.log(‘Fifteen is ‘ + (a + b) + ‘ and\nnot ‘ + (2 * a + b) + ‘.‘);

    // "Fifteen is 15 and

    // not 20."

    现在通过模板字符串,我们可以使用一种更优雅的方式来表示:

    var a = 5;

    var b = 10;

    console.log(`Fifteen is ${a + b} and

    not ${2 * a + b}.`);

    // "Fifteen is 15 and

    // not 20."

    嵌套模板

    在某些时候,嵌套模板是具有可配置字符串的最简单也是更可读的方法。 在模板中,只需在模板内的占位符 ${ }内使用它们,就可以轻松地使用内部反引号。 例如,如果条件 a 是真的,那么返回这个模板化的文字。

    一个普通字符串例子:

    var classes = ‘header‘

    classes += (false ?

    ‘‘ : true ?

    ‘ icon-expander‘ : ‘ icon-collapser‘);

    输出:header icon-expander

    在ES2015中使用模板文字而没有嵌套:

    var classes = `header ${ false ? ‘‘ :

    (true ? ‘icon-expander‘ : ‘icon-collapser‘) }`;

    输出:header icon-expander

    在ES2015的嵌套模板字面量中:

    var classes = `header ${ false ? ‘‘ :

    `icon-${true ? ‘icon-expander‘ : ‘icon-collapser‘}` }`;

    输出:header icon-icon-expander

    带标签的模板字符串

    更高级的形式的模板字符串是带标签的模板字符串。标签使您可以用函数解析模板字符串。标签函数的第一个参数包含一个字符串值的数组。其余的参数与表达式相关。最后,你的函数可以返回处理好的的字符串(或者它可以返回完全不同的东西, 如下个例子所述)。用于该标签的函数的名称可以被命名为任何名字。

    var person = ‘Mike‘;

    var age = 28;

    ?

    function myTag(strings, personExp, ageExp) {

    ?

    var str0 = strings[0]; // "that "

    var str1 = strings[1]; // " is a "

    ?

    // There is technically a string after

    // the final expression (in our example),

    // but it is empty (""), so disregard.

    // var str2 = strings[2];

    ?

    var ageStr;

    if (ageExp > 99){

    ageStr = ‘centenarian‘;

    } else {

    ageStr = ‘youngster‘;

    }

    ?

    return str0 + personExp + str1 + ageStr;

    ?

    }

    ?

    var output = myTag`that ${ person } is a ${ age }`;

    ?

    console.log(output);

    // that Mike is a youngster

    标签函数并不一定需要返回一个字符串。可以返回其他数据类型,比如数组、json等

    原始字符串

    在标签函数的第一个参数中,存在一个特殊的属性raw,我们可以通过它来访问模板字符串的原始字符串,而不经过特殊字符的替换。

    function tag(strings) {

    console.log(strings.raw[0]);

    }

    ?

    tag`string text line 1 \n string text line 2`;

    // logs "string text line 1 \n string text line 2"

    另外,使用String.raw()方法创建原始字符串和使用默认模板函数和字符串连接创建是一样的。

    var str = String.raw`Hi\n${2+3}!`;

    // "Hi\n5!"

    ?

    str.length;

    // 6

    ?

    str.split(‘‘).join(‘,‘);

    // "H,i,\,n,5,!"

    研究了一下,其实模板字符串中的占位符${expression}相当于分隔符,将模板字符串分割,

    function tag(strings) {

    console.log(strings.raw[0]);

    ?

    console.log(strings.raw[1]);

    ?

    console.log(strings.raw[2]);

    }

    ?

    tag`${document.cookie}`;

    //0,1都是空,3是undefined

    tag`aaa${document.cookie}`;

    //0是aaa,1是空,3是undefined

    tag`aaa${document.cookie}bbb`;

    //0是aaa,1是bbb,3是undefined

    tag`aaa${document.cookie}bbb${document}ccc`;

    //0是aaa,1是bbb,3是ccc

    从上面例子可以看出占位符${expression}相当于分隔符,将模板字符串分割。

    带标签的模板字面量及转义序列

    自ES2016起,带标签的模版字面量遵守以下转义序列的规则:

    Unicode字符以"\u"开头,例如\u00A9

    Unicode码位用"\u{}"表示,例如\u{2F804}

    十六进制以"\x"开头,例如\xA9

    八进制以""和数字开头,例如\251

    20190813004826945228.png

    注:八进制好像不管用

    参考资料

    展开全文
  • 1.如果我们的表名、字段名是mysql的关键字,如table 、from 等,则必须要加上反引号``才可以使用 如table 、from,SELECT date from from。

    1.如果我们的表名、字段名是mysql的关键字,如table 、from 等,则必须要加上反引号``才可以使用
    tablefrom,SELECT date from from

    展开全文
  • 在网上一搜一大堆,摘抄...1、由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。如: $ string=’$PATH’ $ echo $string $PATH $ 可见$保持了其本身...

    在网上一搜一大堆,摘抄一个写的比较好的内容如下:

    (原地址: https://blog.csdn.net/iamlaosong/article/details/54728393

    1、由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。如:
    $ string=’$PATH’
    $ echo $string
    $PATH
    $
    可见$保持了其本身的含义,作为普通字符出现。

    2、由双引号括起来的字符,除$(美元符号)、\(反斜杠)、’(单引号)、和”(双引号)这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于“$”来说,就是用其后指定的变量的值来代替这个变量和$;对于“\”而言,是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加上“\”的只有四个字符$,\,’和”本身。而对”号,若其前面没有加“\”,则Shell会将它同前一个”号匹配。如例程中的"-$i day",会随着循环,将$i转换成其代表的值。

    3、反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。如例程中的`date -d '-1 day' +%Y%m%d`就是把这条命令的结果赋给变量OPDATE。

    4、反引号还可以嵌套使用。但需注意,嵌套使用时内层的反引号必须用反斜杠(\)将其转义。例如:
    $ abc=`echo The number of users is \`who| wc -l\``
    $ echo $abc
    The number of users is 2
    $
    5、在反引号之间的命令行中也可以使用shell的特殊字符。Shell为得到``中命令的结果,它实际上要去执行``中指定的命令。执行时,命令中的特殊字符,如$,”,?等又将具有特殊含义,并且``所包含的可以是任何一个合法的Shell命令,如:
    $ ls
    note readme.txt Notice Unix.dir
    $ TestString="`echo $HOME ` ` ls [nN]*`"
    $ echo $TestString
    /home/yxz note Notice

    最后,说句题外话: 反引号是一个老的用法,$()才是新的用法,如例程中的$(seq 10)。无论是在学习中,还是在实际工作中,$()都是被推荐的用法。所以上面的的用法可以改成:

    $ TestString="$(echo $HOME) $(ls [nN]*)"

    $ echo $TestString

    /home/yxz note Notice

    对于脚本的执行情况,可以用下面的命令来分析:

    sh -x test.sh

     

    举几个例子就知道了:

     

    但是以\n为例子进行打印测试时,发现服务器和服务器输出结果不一样,不知道是不是因为zsh和ssh的关系

    展开全文
  • 反引号与$()的区别以及eval的作用

    千次阅读 2017-06-22 00:39:48
    $( )与` `(反引号) 在bash shell中,$( )与` `(反引号)都是用来做命令替换(command substitution)用的。 命令替换: echo pwd 这里的pwd就是一个字符串不是命令,所以输出的就是pwd这个字符串,$()和...
  • 一、shell中的反引号(` `)的作用 将反引号(` `)内的字符串当作shell命令来执行,返回值是命令的执行的结果,起到的是一个命令的替换作用。 举例: 输出日期 二、shell中的单引号(' ')的作用 关闭shell中所有...
  • 首先需要区分单引号' '与反引号` ` 单引号,双引号位于enter键左边,用于用户把带有空格的字符串赋值给变量 如果没有单引号或者双引号,shell会把空格后的字符串解释为命令 反引号,位于esc键下面,有执行...
  • 反引号``与$() 反引号``是命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出。语法:`command` $()也有命令替换的作用 4.${}与$ ${ }中放的是变量,例如echo ${hello}取hello...
  • 到现在为止,我已经随机使用单引号,双引号和反引号而没有任何实际想法。例:$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';此外,在上面的示例中,考虑table,col1,val1等可以是变量...
  • $()和··(反引号) ${} $(())用法详解

    千次阅读 2018-10-13 14:18:42
    $( ) 与 ` ` (反引号) 在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的。 所谓的命令替换与变量替换差不多,都是用来重组命令行: * 完成引号里的命令行,然后将其结果替换...
  • 反引号用于表和列标识符,但是仅当标识符是MySQL保留关键字时 ,或者当标识符包含空格字符或超出限制集的字符时才需要使用反引号(请参见下文)。通常建议避免使用保留关键字在可能的情况下用作列或表的标识符,...
  • 一、单引号和双引号 原文点击链接 首先,单引号和双引号,都是为了解决中间有空格的问题。 因为空格在Linux中时作为一个很典型的分隔符,比如string1=this is astring,这样执行就会报错。为了避免这个问题,因此就...
  • 在编写shell脚本时,会经常地使用到单引号、双引号、反引号这些特殊的符号。它们在shell中有着不同的作用,但容易被误用和引起混乱。简单总结一下三者的使用和区别。 单引号 它关闭shell中所有的特殊符号使用和解释...
  • $( )和` `(反引号)和${}和$(())用法

    千次阅读 2014-03-06 15:10:12
    在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的。 所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行: * 完成引号里的命令行,然后将其结果替换...
  • 我们在服务器上经常能看到很多复制,启动停止程序...$( )的用途反引号` `一样,用来表示优先执行的命令,比如ls -l 5、 ${ }就是取变量的值,比如:echo ${PATH}
  • 最近在看《JavaScript语言精粹》这本书,读到了正则表达式一章,文中提及一个匹配...声明字符串时的斜杠和引号 声明字符串时,如果字符串内容中包含 ‘/’ 或者 引号的时候是需要特别注意的。 斜杠 如果你想声明一
  • " "(双引号)与 ' '(单引号)的区别你在shell prompt(shell 提示)后面敲打键盘、直到按下enter的时候,你输入的文字就是command line(命令行)了,然后shell才会以进程方式执行你所提交的命令。但是,你又可知道:你在...
  • 引号字符种种

    2021-05-11 10:17:10
    引号,这个存在于所有键盘上的符号,我最近发现我对它并不了解。在我点击键盘上的引号按键时,得到的并不总是同一个字符。常见的有这三种 ”〞”,这些看起来差不多的双引号对机器来说完全不同,而且差别不仅仅是...
  • 在C++语言中,由于其在一定程度上继承了C语言的编码规则,所以我们经常会在C++的代码中看到C语言的影子,本篇博文就是针对C++语言中的各种斜杠“\”操作,来进行较为详细的探讨。 二. 图表展示斜杠的意义 ...
  • 1. 单引号 ( )howard@0[script]$ grep Susan phonebook Susan Goldberg 403-212-4921 Susan Topple 212-234-2343 如果我们想查找的是Susan Goldberg,不能直接使用grep Susan Goldberg phonebook命令,grep会把
  • 一、引号定义字符串在Php中,通常一个字符串被定义在一对引号中,如:'I am a string in single quotes'"I am a string in double quotes"Php语法分析器是用成对的引号来判断一个字符串的。因此,所有字符串必须使用...
  • PHP 单引号与双引号的区别看好多代码有时候用单引号或双引号实现包含字符串的内容,其实简单个概括下双引号中的变量可以解析,单引号就是绝对的字符串。1、定义字符串 在PHP中,字符串的定义可以使用单引号,也可以...
  • 所以摘了篇文章“单引号和双引号的区别和用法?”现将答案总结了下,写成这篇小短文。" "双引号里面的字段会经过编译器解释,然后再当作HTML代码输出。' '单引号里面的不进行解释,直接输出。例如:$abc='my name is...
  • PHP 单引号与双引号的区别(总结)

    万次阅读 多人点赞 2019-05-10 10:31:58
    看好多代码有时候用单引号或双引号实现包含字符串的内容,其实简单个概括下双引号中的变量可以解析,单引号就是绝对的字符串。 1、定义字符串  在PHP中,字符串的定义可以使用单引号,也可以使用双引号。但是必须...
  • Linux Shell中有三种引号,分别为双引号(" ")、单引号(' ')以及反引号(` `)。其中双引号对字符串中出现的$、''、`和\进行替换;单引号不进行替换,将字符串中所有字符作为普通字符输出,而反引号中字符串作为shell...
  • 最近发现一个问题,是有关引号与转义的,于是就整理了一下这方面的知识,以方便以后温故。双引号:·在字串中使用变量这个功能让你无须使用连接符号来粘和大量的简单字符串。PHP允许我们在双引号串中直接包含字串...
  • 多行字符串 Python在字符串末尾加上斜杠(/)表示字符串在下一行继续。 Java用加号(+)表示字符串在下一行继续。 2.3. Python中其它的表示方法 Python中还有可以在字符串前加前缀r或R:表示自然字符串,即不对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,045
精华内容 7,618
关键字:

反引号用途