有没有办法在Java中使用原始字符串(没有转义序列)?
(我正在编写大量的正则表达式代码,而原始字符串会使我的代码更具可读性)
我了解该语言不会直接提供此功能,但是有什么方法可以以任何方式“模拟”它们吗?
有没有办法在Java中使用原始字符串(没有转义序列)?
(我正在编写大量的正则表达式代码,而原始字符串会使我的代码更具可读性)
我了解该语言不会直接提供此功能,但是有什么方法可以以任何方式“模拟”它们吗?
Answers:
是。
文字块进入Java
一些历史: Raw String Literals被撤回。该功能原本打算作为JDK 12中的预览语言功能,但已撤消且未出现在JDK 12中。 它已由JDK 13中的Text Blocks(JEP 355)取代。
您可以使用文本块轻松定义多行字符串文字。您不需要添加常规String文字附带的视觉混乱:串联运算符和转义序列。您还可以控制如何格式化字符串值。例如,让我们看一下以下HTML代码段:
String html = """
<HTML>
<BODY>
<H1>"Java 13 is here!"</H1>
</BODY>
</HTML>""";
注意,三个引号界定了块的开始和结束。
不,没有。
通常,您会将原始字符串和正则表达式放在属性文件中,但是它们也有一些转义序列要求。
我使用Pattern.quote。并且它解决了问题的问题。因此:
Pattern pattern = Pattern.compile(Pattern.quote("\r\n?|\n"));
quote方法返回一个与提供的string参数匹配的字符串,该返回字符串是本例中正确引用的字符串。
"\."
。
Pattern.quote
即使Java具有原始字符串文字,也将需要使用:Java字符串文字中的像.
和+
不需要任何特殊处理的字符,但仍需要对正则表达式进行转义。Python支持原始字符串文字,但仍具有re.escape
。
\*
序列。Java中缺少原始字符串,这使得创建带有将特殊字符视为文字的正则表达式模式的概念和创建带有特殊字符的字符串数据的概念相形见flat。这些是独立的概念。
foo("\\[")
可以很foo("[")
开心了。
将原始文本文件放在您的类路径中,然后使用getResourceAsStream(....)读取它
(属性文件是常见的,但是很凌乱-我将大多数正则表达式都视为代码,并将其保存在我可以引用的位置,您也应该这样做。至于实际问题:)
是的,有一些方法可以解决可读性差的问题。您可以尝试:
String s = "crazy escaped garbage"; //readable version//
尽管在更新时需要小心。Eclipse有一个选项,允许您在引号之间粘贴文本,并为您应用转义序列。策略是先编辑可读版本,然后删除垃圾,并将其粘贴在空引号“”之间。
提示时间:
修改您的编辑器以进行转换;作为插件发布。我到处检查了插件,但没有找到(尽管尝试搜索)。转义的源字符串和文本框文本之间存在一一对应的关系(折价\ n,\ r \ n)。也许可以使用在结尾处带有两个引号的突出显示的文本。
String s = "##########
#####";
其中#是任何字符,突出显示-换行符被视为换行符。在突出显示区域中键入或粘贴的文本在“真实”源中进行转义,并显示为好像不是。(与Eclipse转义粘贴文本的方式相同,这将转义键入的文本,并在显示时不带反斜杠。)如果要正常编辑,请删除其中的引号引起语法错误。嗯
注意:截至今天为止,尚不可用。每当功能发布时,我可能都会再次编辑此答案。
正在进行中的建议是在Java中引入Raw Strings。在正则表达式的情况下,它们实际上很有用。
示例1:编码为的正则表达式字符串
System.out.println("this".matches("\\w\\w\\w\\w"));
可以交替编码为
System.out.println("this".matches(`\w\w\w\w`));
因为反斜杠不被解释为具有特殊含义。
例2:多行带外语的String文字追加。
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>
`;
这避免了中间引号,串联和显式换行符的需要。
希望我们能尽快发布。
String#getBytes()公开包含在每个单个String对象中的内部字节数组的副本,该对象实际上包含16位UTF-16编码的String-字节数组将包含转换为与平台的默认字符集匹配的相同字符串。我的意思是,我认为这与Java中的字符串几乎一样。
我个人认为正则表达式是字符串数据,而不是代码,因此我在代码中不喜欢它们-但我意识到这是不切实际且不受欢迎的(是的,我知道,您不必大吼大叫我)。
鉴于没有自然的方式可以做到这一点,我可以提出两种可能性(嗯,三种,但是第三种是,不自然的)。
因此,我个人的喜好是将文件解析为字符串。您可以命名文件中的每个条目,并将它们全部加载到哈希表中,以便从代码轻松访问。
第二选择,创建一个文件,该文件将被预处理为Java接口;这样做可以逃脱正则表达式。我个人不喜欢代码生成,但是如果java文件是100%从未人为编辑的,那还算不错(真正的邪恶是生成了您希望编辑的文件!)
第三(有点棘手,可能是个坏主意):您可能能够创建一个自定义doclet,该doclet会在编译时将注释中的字符串提取到文本文件或头文件中,然后使用上述两种其他方法之一。这样会将您的字符串保存在使用它们的同一文件中。要做到这一点真的很难,而且失败的代价是极高的,因此,除非我有压倒性的需求和一些相当出色的才能,否则我什至不会考虑。
我之所以只建议这样做,是因为注释是自由格式的,并且“ pre”标记中的内容对于格式化程序和其他系统丑陋的对象来说是非常安全的。doclet可以在打印javadocs之前将其提取出来,甚至可以添加一些生成的javadocs来表明您使用了正则表达式字符串。
在拒绝投票并告诉我这是一个愚蠢的想法之前-我知道,我只是想建议这样做,因为它很有趣,但是如上所述,我的偏好是一个简单的文本文件...
否。但是有一个IntelliJ插件,使它更易于处理,称为String Manipulation。
IntelliJ还将自动转义粘贴到其中的字符串。(正如@Dread指出的那样,Eclipse有一个插件可以启用此功能。)