代码之家  ›  专栏  ›  技术社区  ›  Debajit

Java中的原始字符串——特别是正则表达式

  •  67
  • Debajit  · 技术社区  · 15 年前

    在Java中有没有使用原始字符串的方法(没有转义序列)?

    (我正在编写大量的regex代码和原始字符串,这将使我的代码更加可读)

    我理解语言并没有直接提供这些信息,但是有没有任何方法可以“模拟”它们呢?

    11 回复  |  直到 7 年前
        1
  •  37
  •   stevedbrown    15 年前

    不,没有。

    通常,您会将原始字符串和正则表达式放在属性文件中,但它们也有一些转义序列要求。

        2
  •  46
  •   Dread    14 年前

    如果您使用Eclipse,这是一个解决方案。 在将文本粘贴到字符串文本中时,可以自动对长文本块进行正确的多行和特殊字符转义。

    “粘贴在这里”;

    如果在 窗口的首选项,即Java JavaY编辑器,类型为:“当粘贴到字符串文本时,转义文本”

        3
  •  25
  •   Basel Shishani    10 年前

    我用 Pattern.quote . 它解决了这个问题。因此:

    Pattern pattern = Pattern.compile(Pattern.quote("\r\n?|\n"));
    

    Quote方法返回一个与所提供的字符串参数匹配的字符串,返回字符串是我们的案例中正确引用的字符串。

        4
  •  11
  •   jsight TaherT    15 年前

    不(很遗憾)。

        5
  •  3
  •   Thorbjørn Ravn Andersen    15 年前

    将原始文本文件放在类路径中,并使用getresourceasstream(…)读取它。

        6
  •  3
  •   mk.    15 年前

    ( Properties files 是常见的,但混乱的-我把大多数regex视为代码,并把它放在我可以引用的地方,您也应该这样做。至于实际问题:)

    是的,有很多方法可以解决可读性差的问题。你可以试试:

    String s = "crazy escaped garbage"; //readable version//
    

    尽管这需要在更新时小心。Eclipse提供了一个选项,允许您在引号之间粘贴文本,并为您应用转义序列。策略是先编辑可读的版本,然后删除垃圾,并将它们粘贴在空引号“”之间。


    想法时间:

    黑客你的编辑器来转换它们;作为插件发布。我到处查看插件,但没有找到(尝试搜索)。转义的源字符串和文本框文本(折扣\n、\r\n)之间有一对一的对应关系。也许可以使用结尾有两个引号的突出显示的文本。

    String s = "##########
    #####";
    

    其中是突出显示的任何字符-换行符被视为换行符。在突出显示区域内键入或粘贴的文本将在“真实”源中转义,并显示为不显示。(与Eclipse对粘贴的文本进行转义的方式相同,这将转义键入的文本,并且不显示反斜杠。)如果要正常编辑,请删除其中一个引号以导致语法错误。隐马尔可夫模型。

        7
  •  3
  •   Suresh Atta    7 年前

    注:截至今日,不提供。可能我会在功能发布时再次编辑这个答案。

    There is an ongoing proposal to introduce Raw Strings in Java . 它们实际上在regex的情况下非常有用。

    例1: 一个正则表达式字符串,它被编码为

      System.out.println("this".matches("\\w\\w\\w\\w"));
    

    可交替编码为

    System.out.println("this".matches(`\w\w\w\w`));
    

    因为反斜杠没有特殊意义。

    实例2: 一个多行字符串文本,带有外文附录。

    A multiple line string that was coded as 
        String html = "<html>\n" +
                    "    <body>\n" +
                    "         <p>Hello World.</p>\n" +
                    "    </body>\n" +
                    "</html>\n";
    

    可交替编码为

     String html = `<html>
                           <body>
                               <p>Hello World.</p>
                           </body>
                       </html>
                      `;
    

    这样就不需要中间引号、连接和显式换行。

    希望我们能尽快发布。

        8
  •  2
  •   Esko    15 年前

    String#getBytes() 显示每个字符串对象中包含的内部字节数组的副本,该对象实际包含16位UTF-16编码字符串-字节数组将包含转换为与平台默认字符集匹配的相同字符串。我想说的是,我认为这与Java中的“原始”字符串很接近。

        9
  •  0
  •   ShabbyDoo    15 年前

    您可以编写自己的非转义属性读取器,并将字符串放入资源文件中。

        10
  •  0
  •   Bill K    15 年前

    我个人认为regex字符串是数据而不是代码,所以我不喜欢在我的代码中使用它们——但我意识到这是不切实际和不受欢迎的(是的,我意识到了,你不必对我大喊大叫)。

    考虑到没有本土的方法可以做到这一点,我可以想出两种可能性(好吧,三种,但第三种是,嗯,不自然)。

    所以我个人的偏好是将一个文件解析成字符串。您可以命名文件中的每个条目,并将它们全部加载到哈希表中,以便从代码中轻松访问。

    第二个选择,创建一个文件,该文件将被预处理到Java接口;它可以逃脱正则表达式,因为它这样做。我个人讨厌代码生成,但是如果Java文件是100%,从来没有人编辑过,这不是太坏(真正的邪恶是生成的文件,你希望编辑!)

    第三种方法(很棘手,可能是个坏主意):您可以创建一个自定义doclet,在编译时将注释中的字符串提取到文本文件或头文件中,然后使用上面另外两种方法之一。这会将字符串保存在使用它们的同一个文件中。这可能真的很难做到正确,而且失败的惩罚是极端的,所以我甚至不会考虑它,除非我有一个压倒性的需要和一些相当令人印象深刻的人才。

    我只是建议这样做,因为评论是自由形式的,“pre”标签中的内容对于格式化程序和其他系统缺陷非常安全。doclet可以在打印javadocs之前提取它,甚至可以添加一些生成的javadocs来指示您使用regex字符串。

    在投反对票并告诉我这是一个愚蠢的想法之前——我知道,我只是觉得我会建议它,因为它很有趣,但是我的偏好,如我上面所说,是一个简单的文本文件……

        11
  •  0
  •   Community paulsm4    7 年前

    不需要。但是有一个Intellij插件,它可以让这个更容易处理,调用 String Manipulation .

    Intellij还将自动转义粘贴到其中的字符串。(恐惧) points out ,Eclipse有一个插件来启用它。)

    推荐文章