【问题标题】:Java Regexp patterns have double backslashes, how to store patterns in readable formatJava Regex 模式有双反斜杠,如何以可读格式存储模式
【发布时间】:2013-04-13 04:31:42
【问题描述】:

如果有一种方便的方式来存储带有单个反斜杠的模式,那就太好了。一些解决方法:将其存储在文件中并使用 NIO 读取。缺点:Java EE 不允许 IO 访问。以某种方式存储在 JNDI 中。也许 java 5 Pattern.LITERAL 标志的新手可以提供帮助?我想使用普通模式字符串,例如\d,而不是\\d

【问题讨论】:

  • 请注意,这与正则表达式无关; Java 中所有字符串文字中的反斜杠字符都写为 \\.

标签: java regex


【解决方案1】:

麻烦的是\在创建String时是java中的一个特殊字符,不管是否正则表达式。

例如String s = "\t";

你不能将它用于任意字符,String s = "\a"; 会给你一个编译时错误。有效字符为 b、t、n、f、r、"、' 和 \

因此,要在 java 中的字符串中获取文字 \,您需要像这样对其进行转义:\\。因此,您的 only 选项是在 java 文件中不包含这些字符串,因此在您的 java 文件加载的外部文件中。 Pattern.LITERAL 根本没有帮助,因为您仍然需要一个有效的 java 字符串,而 \d 不需要。

【讨论】:

    【解决方案2】:

    如果您有兴趣从文件中读取表达式,请考虑将文件打包到 jar 中,并使用 Class.getResourceAsStream(...)。 AFAIK,Java EE 中仍然允许这样做。

    【讨论】:

      【解决方案3】:

      如果您只在 Java 中工作,我的建议是不要为此烦恼。只需存储 Java 可以理解的正则表达式,即带有烦人的双重 \

      如果并且仅当您想要存储正则表达式以将它们用作不同语言的文件输入时,然后使用标准正则表达式表示法创建文本文件。但是随后您将必须创建某种类,该类将逐字符读取并处理转义字符本身,然后再将它们添加到要在模式匹配器上使用的字符串中。

      它的工作量很大,(实际上不是很多,但该死的,如果它不会是一个挑剔的工作)但你只需要做一次,你可以将它扩展到多种语言,这将是一个很好的学习我认为的经验。做错了,你会在调试这个小混蛋时遭受很多痛苦。

      可能是对 Java 的一个很好的补充,如果不是重要的话,它是一种允许文件中的文本直接作为正则表达式标准字符串读取的标志,它会自行进行必要的更改。我必须检查是否有人建议了此功能。

      PS:刚刚注意到,您必须在这里转义 \ 才能使其可见...这很奇怪...

      【讨论】:

      • 如果您从文件中读取反斜杠,则无需编写代码来转义反斜杠。额外的反斜杠用于在 java 语法中转义。
      • @Dilum 是对的:只有当 在 Java 源代码中创建正则表达式时,所有双重转义才是必需的,作为字符串文字。如果您从其他地方读取它,例如文件或 JTextField,则不需要额外的转义。您在大多数其他语言中看不到此问题的原因是它们提供正则表达式文字或原始/逐字/非插值字符串文字(或两者)。
      • 顺便说一句,您可以使用反引号或缩进来格式化帖子中的代码,因此您不必(例如)转义反斜杠。你可以编辑你的答案,看看我是怎么做到的。按文本框上方的橙色“帮助”按钮可获得更多选项。
      • 这就是我喜欢堆栈溢出的原因,我学到了很多东西。仍然不明白为什么在 java 中定义正则表达式时他们选择了这种双重标准。为什么不这样做,毕竟你在使用它时明确地说是一个正则表达式。我应该删除我的答案,因为它是错误的还是留作参考?有什么习俗?
      猜你喜欢
      • 2010-11-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多