有没有办法在Java中使用原始字符串(没有转义序列)?
(我正在写相当数量的正则表达式代码,原始字符串会使我的代码更具可读性)
据我所知,该语言没有直接提供,但有没有办法以任何方式“模拟”它们?
答案 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有一个插件来启用它。)