Java中的原始字符串-特别是正则表达式。多行字符串

Java中的原始字符串-特别是正则表达式。多行字符串,java,regex,string,rawstring,Java,Regex,String,Rawstring,有没有办法在Java中使用原始字符串(没有转义序列) (我正在编写大量的正则表达式代码,原始字符串将使我的代码更具可读性) 我知道语言没有直接提供这一点,但是有没有任何方法可以“模拟”它们呢?没有(非常遗憾)。没有 通常,您会将原始字符串和正则表达式放入属性文件中,但是它们也有一些转义序列要求。公开了每个字符串对象中包含的内部字节数组的副本,该字符串对象实际上包含16位UTF-16编码字符串-字节数组将包含转换为匹配平台默认字符集的相同字符串。我想说的是,我认为这与java中的“原始”字符串很接

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

(我正在编写大量的正则表达式代码,原始字符串将使我的代码更具可读性)

我知道语言没有直接提供这一点,但是有没有任何方法可以“模拟”它们呢?

没有(非常遗憾)。

没有


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

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

你可以编写自己的非逃生属性读取器,并把字符串放在资源文件中。

我个人认为正则表达式是字符串数据而不是代码,所以我不喜欢代码中的代码,但我意识到这是不切实际的,不受欢迎的。(是的,我知道,你不必对我大喊大叫)

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

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

第二种选择是,创建一个文件,该文件将被预处理为java接口;这样做时,它可能会逃逸正则表达式。就个人而言,我讨厌代码生成,但如果java文件100%从未经过人工编辑,那也不算太坏(真正的邪恶是生成了您希望编辑的文件!)

第三(棘手,可能是个坏主意):您可以创建一个自定义doclet,在编译时将注释中的字符串提取到文本文件或头文件中,然后使用上述另外两种方法之一。这将使字符串保持在使用它们的同一文件中。这可能很难正确执行,失败的惩罚是极端的,因此我除非我有一个压倒一切的需要和一些令人印象深刻的天赋。 我之所以建议这样做,是因为注释是自由形式的,“pre”标记中的内容对于格式化程序和其他系统来说是非常安全的。doclet可以在打印javadocs之前提取这些内容,甚至可以添加一些生成的javadocs,指示您使用regex字符串


在否决并告诉我这是一个愚蠢的想法之前——我知道,我只是想我会建议它,因为它很有趣,但我如上所述的偏好是一个简单的文本文件…

将原始文本文件放在您的类路径中,并使用getResourceAsStream(…)阅读它。

(很常见,但很混乱-我将大多数正则表达式视为代码,并将其保存在我可以引用的地方,您也应该这样做。至于实际问题:)

是的,有一些方法可以解决可读性差的问题。您可以尝试:

String s = "crazy escaped garbage"; //readable version//
尽管这需要在更新时小心。Eclipse有一个选项,允许您在引号之间粘贴文本,转义序列将为您应用。策略是先编辑可读版本,然后删除垃圾,并将它们粘贴到空引号“”之间


创意时间:

破解编辑器以转换它们;作为插件发布。我检查了插件,但没有找到(尝试搜索)。转义的源字符串和文本框文本之间有一对一的对应关系(打折,\r\n)。可能可以使用两端带双引号的突出显示文本

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

其中#是高亮显示的任何字符-分隔符被视为换行符。在高亮显示区域内键入或粘贴的文本在“真实”源中转义,并显示为不存在。(与Eclipse转义粘贴的文本的方式相同,这将转义键入的文本,并且显示时不带反斜杠。)如果要正常编辑,请删除其中一个引号以导致语法错误。嗯。

如果使用eclipse,这是一个解决方法。 将文本粘贴到字符串文字中时,可以自动使长文本块正确地多行,并自动转义特殊字符

“-粘贴在此处-”

如果在窗口中启用该选项→偏好→JAVA→编辑→打字→“粘贴到字符串文字时转义文本”

我使用。它解决了问题。因此:

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

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

否。但是有一个IntelliJ插件使这更容易处理,名为


IntelliJ还将自动转义粘贴到其中的字符串。(作为@Dread,Eclipse有一个插件来启用此功能。)

注意:从今天起,不可用。可能我会在功能发布时再次编辑此答案。

.它们在正则表达式的情况下实际上非常有用

示例1:编码为

  System.out.println("this".matches("\\w\\w\\w\\w"));
可交替编码为

System.out.println("this".matches(`\w\w\w\w`));
 String html = `<html>
                       <body>
                           <p>Hello World.</p>
                       </body>
                   </html>
                  `;
因为反斜杠没有被解释为具有特殊含义

示例2:一个带有外语附录的多行字符串文字

A multiple line string that was coded as 
    String html = "<html>\n" +
                "    <body>\n" +
                "         <p>Hello World.</p>\n" +
                "    </body>\n" +
                "</html>\n";
编码为的多行字符串
字符串html=“\n”+
“\n”+
“你好,世界。

\n”+ “\n”+ “\n”;
可交替编码为

System.out.println("this".matches(`\w\w\w\w`));
 String html = `<html>
                       <body>
                           <p>Hello World.</p>
                       </body>
                   </html>
                  `;
String html=`
你好,世界

`;
这避免了中间引号、连接和显式换行符的需要

希望我们能很快发布。