在Java中的原始string – 特别是正则expression式

有什么办法在Java中使用原始string(没有转义序列)?

(我正在写相当数量的正则expression式代码,原始string会使我的代码更加可读)

我明白这个语言并不直接提供这个语言,但是有什么方法可以用任何方式“模拟”它们吗?

不,没有。

一般来说,你会把原始string和正则expression式放在一个属性文件中,但是这些也有一些转义序列的要求。

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

“-paste here-”;

如果您在窗口→首选项→Java→编辑器→打字→“粘贴到string文字时转义文本”中启用该选项

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

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

quote方法返回一个与提供的string参数匹配的string,返回string是我们的情况下正确引用的string。

没有(很可悲)。

在您的类path中有原始文本文件,并使用getResourceAsStream(….)

( 属性文件是常见的,但杂乱 – 我把大部分的正则expression式作为代码,并保持在我可以引用它,你也应该。至于实际的问题:)

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

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

尽pipe这在更新时需要谨慎。 Eclipse有一个选项,可以让你在两个引号之间粘贴文本,转义序列也适用于你。 策略是首先编辑可读的版本,然后删除垃圾,并将其粘贴在空引号“”之间。


想法时间:

破解你的编辑器来转换它们; 作为插件发布。 我检查了周围的插件,但没有发现(尽pipesearch虽然)。 转义的源string和文本框文本之间存在一一对应关系(折扣\ n,\ r \ n)。 也许可以使用在两端用两个引号突出显示的文本。

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

其中#是任何字符,突出显示 – 中断被视为新行。 在高亮显示的区域中键入或粘贴的文本将在“真实”来源中转义,并显示为不是。 (与Eclipse转义粘贴文本的方式相同,这将会使types化文本转义,并且不显示反斜杠。)如果要正常编辑,请删除其中一个引号,以引起语法错误。 嗯。

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

你可以编写你自己的,非转义的属性阅读器,并把你的string放在一个资源文件中。

我个人认为正则expression式string数据而不是代码,所以我不喜欢他们在我的代码 – 但我意识到这是不切实际和不受欢迎(是的,我意识到这一点,你不必骂我)。

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

所以我个人的偏好是将文件parsing成string。 您可以为文件中的每个条目命名,并将它们全部加载到散列表中,以便从代码中轻松访问。

第二个select,创build一个文件,将被预处理成一个java界面; 它可以逃避正则expression式。 就我个人而言,我讨厌代码生成,但如果Java文件是100%从来没有人为编辑,这不是太糟糕了(真正的邪恶是生成的文件,你期望编辑!)

第三个(棘手的,也许是一个坏主意):你可能可以创build一个自定义的doclet,在编译时将你的注释中的string提取到一个文本文件或一个头文件中,然后使用上述其他方法之一。 这使您的string保持在与之相同的文件中。 这可能是很难做到的,对失败的惩罚是极端的,所以我甚至不会考虑它,除非我有一个非常需要和一些非常出色的天赋。

我只是build议这样做,因为注释是自由格式的,“pre”标签中的内容对格式化程序和其他系统丑事来说是非常安全的。 doclet可以在打印javadoc之前解压缩,甚至可以添加一些生成的javadoc来指示你使用正则expression式string。

之前downvoting和告诉我这是一个愚蠢的想法 – 我知道,我只是想我会build议,因为它很有趣,但我的偏好,如上所述是一个简单的文本文件…

不,但有一个IntelliJ插件,这使得这更容易处理,称为string操作 。

IntelliJ也会自动转义一个粘贴到它的string。 (正如@Dread 指出的 ,Eclipse有一个插件来启用它。)