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

Pla*_*mer 68 java regex string rawstring

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

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

我知道这种语言并没有直接提供,但有没有办法以任何方式"模拟"它们?

小智 47

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

"-paste here-";

如果您在窗口→首选项→java→编辑器→键入→"粘贴到字符串文字时转义文本"中启用该选项

  • 这太棒了.我希望我早点知道这个功能! (5认同)

ste*_*own 37

不,没有.

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

  • 请参阅我对此问题的回答.现在有一种方法.http://stackoverflow.com/a/16118875/1198772 (3认同)

ism*_*nni 27

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

Pattern pattern = Pattern.compile(Pattern.quote("\r\n?|\n"));
Run Code Online (Sandbox Code Playgroud)

quote方法返回一个字符串,该字符串与提供的字符串参数匹配,返回字符串是我们的情况下正确引用的字符串.

  • 那很聪明,但是...... aaaaargh.什么是现代语言中应该是非问题的hacky解决方案.根据ygormutti的观察,我甚至不确定这是值得的. (5认同)
  • 请注意,如果转义字符不是Java字符串文字的有效scape序列但对正则表达式有效,则不起作用,例如:`"\."`. (3认同)
  • @AlexShesterov 正则表达式中的转义特殊字符仍然是传递给正则表达式引擎的“正则表达式的一部分”。也就是说,正则表达式引擎接收一个文字“\*”序列。Java 中缺乏原始字符串,这将创建具有被视为文字的特殊字符的正则表达式模式的概念与创建具有特殊字符的字符串数据的概念混为一谈。*这些是不同的概念*。 (3认同)

jsi*_*ght 11

不(非常遗憾).

  • 这是我见过的第一个通过利用 Java 程序员的情感而获得如此多赞成票的答案 xD (2认同)

Kap*_*nir 10

是的

文本块来到 Java

Java 13 提供期待已久的多行字符串

一些历史: 原始字符串文字撤回。这原本是 JDK 12 中的一个预览语言特性,但它被撤回并且没有出现在 JDK 12 中。 它被 JDK 13 中的 Text Blocks (JEP 355) 取代。

您可以使用文本块轻松定义多行字符串文字。您不需要添加常规字符串文字带来的视觉混乱:连接运算符和转义序列。您还可以控制字符串值的格式。例如,让我们看看以下 HTML 片段:

String html = """
<HTML>
  <BODY>
    <H1>"Java 13 is here!"</H1>
  </BODY>
</HTML>""";
Run Code Online (Sandbox Code Playgroud)

请注意分隔块开头和结尾的三个引号

  • 这个接受的答案是不正确的。问题是关于使用原始字符串特别是**正则表达式**。尝试以下(使用适当的换行符) String regex = """ hello\d """; 编译器抱怨 \d 是非法转义字符。 (4认同)

Tho*_*sen 5

在类路径中包含原始文本文件并使用 getResourceAsStream(....)