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

时间:2009-08-10 19:12:26

标签: java regex string rawstring

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

(我正在写相当数量的正则表达式代码,原始字符串会使我的代码更具可读性)

据我所知,该语言没有直接提供,但有没有办法以任何方式“模拟”它们?

12 个答案:

答案 0 :(得分:47)

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

“ - 粘贴在这里 - ”;

如果您在窗口→偏好设置→java→编辑器→键入→“粘贴到字符串文字时转义文本”

中启用该选项

答案 1 :(得分:37)

不,没有。

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

答案 2 :(得分:26)

我使用Pattern.quote。它解决了问题的问题。正是如此:

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

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

答案 3 :(得分:11)

不(非常遗憾)。

答案 4 :(得分:4)

文本块来到Java

Java 13 delivers long-awaited multiline strings

一些历史记录: Raw String Literals撤回。该功能原本打算作为JDK 12中的预览语言功能,但已撤消且未出现在JDK 12中。 It was superseded by Text Blocks (JEP 355) in JDK 13.

您可以使用文本块轻松定义多行字符串文字。您无需添加常规String文字附带的视觉混乱:串联运算符和转义序列。您还可以控制如何格式化字符串值。例如,让我们看看以下HTML代码段:

each

请注意三个引号,它们界定了块的开始和结束。

答案 5 :(得分:3)

将原始文本文件放在类路径中并使用getResourceAsStream(....)读取

答案 6 :(得分:3)

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

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

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

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


创意时间:

破解你的编辑器来转换它们;作为插件发布。我检查了插件,但没有找到(尝试搜索)。转义的源字符串和文本框文本之间存在一对一的对应关系(折扣\ n,\ r \ n)。也许可以使用带有两个引号的高亮文本。

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

其中#是任何突出显示的字符 - 中断被视为换行符。在突出显示的区域中键入或粘贴的文本将在“真实”源中转义,并显示为不是。 (与Eclipse转义粘贴文本的方式相同,这将转义键入的文本,并且在没有反斜杠的情况下也会显示它。)如果要正常编辑,请删除其中一个引号以导致语法错误。 HMM。

答案 7 :(得分:3)

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

There is an ongoing proposal to introduce Raw Strings in Java。它们在正则表达式的情况下实际上非常有用。

示例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)

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

鉴于没有本地方法可以做到这一点,我可以提出两种可能性(好吧,三种,但第三种是,嗯,不自然)。

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

第二种选择,创建一个将被预处理成java接口的文件;它可以逃避正则表达式。我个人讨厌代码生成,但如果java文件是100%从不进行人工编辑,那就不算太糟糕了(真正的邪恶就是生成你需要编辑的文件!)

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

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

在贬低并告诉我这是一个愚蠢的想法之前 - 我知道,我只是认为我会建议它,因为它很有趣,但我上面提到的偏好是一个简单的文本文件......

答案 11 :(得分:0)

没有。但是有一个IntelliJ插件可以更容易处理,称为String Manipulation

IntelliJ也会自动转义粘贴到其中的字符串。 (作为@Dread points out,Eclipse有一个插件来启用它。)