为什么id不匹配/\*{2}(.*)\*/

时间:2014-01-06 14:19:58

标签: java regex

我想用我的正则表达式/*{2}(.*)*/

选择以下文字
 /**
 * <p>
 * and writes file to {@link #writeToFile(String, java.util.Map) writeToFile} \\n
 * ddddddddddddd
 * </p>
 * <p>bla bla</p>
 *
 * and get from class.
 *
 * @param filePath
 * @param classes
 * @return
 * @throws Exception
 */

但它不匹配。我不知道我做错了什么。这就是我的阅读方式,找到\后跟我的两个*实例,然后匹配任何内容,直到找到*后跟/

但它只匹配/**其他一切都被忽略了。

4 个答案:

答案 0 :(得分:3)

您需要通过在*前面放置\来逃避(.*)。当它未被转义时,它将被解释为您的模式中使用的任意重复量词:/\*{2}(.*)\*/

转义后,您的模式应如下所示:

\\*

如果您的语言要求您在字符串中转义反斜杠,请确保将它们双重转义。在Java中,模式\*表示正则表达式*,它与*/文字匹配。


请注意,要解析此评论语法,大多数语言都会停在第一个*,这就是为什么通过附加{?量词lazy可能会更好{1}}:

/\*{2}(.*?)\*/

这样,如果你运行正则表达式对抗例如/** foo bar */ */,仅匹配foo bar(不包括以下*/,与greedy quantifier的情况相同。)

答案 1 :(得分:1)

您是否设置modifier (?s)以使点匹配所有字符,包括换行符。

作为Java字符串:

String regex = "(?s)/\\*{2}(.*?)\\*/";

答案 2 :(得分:0)

问题是(Point)表示“除换行之外的任何字符”。 所以这里的这个将是你的解决方案:

/[\*]{2}(.*?\n)* \*/

如果您需要一个小组来查看该区块的信息,它将如下所示:

/[\*]{2}((?:.*?\n)*) \*/

答案 3 :(得分:0)

Rassmussen和Marius Schulz都是正确的。您需要加倍转义所有*,例如\\*.与换行符不匹配,例如\n\r

这是一个字符串,当作为正则表达式实现时,将匹配任何操作系统上的任何javadoc注释:

"/\\*\\*(?:.|\r?\n)*?\\*/"

http://myregexp.com/signedJar.html

进行了测试

阐释:

  • /与文字字符\匹配。
  • \\*与文字字符*匹配。
  • (?:.|\r?\n)是一个非捕获组。
    • (?:启动非捕获组。
    • .匹配除换行符之外的任何字符。
    • |相当于“或”。
    • \r?\n匹配任何操作系统上的换行符。在基于UNIX的操作系统上,\n是换行符,但在Windows上,换行符为\r\n?使上一项可选,因此\r?\n将匹配\n \r\n。这使得正则表达式适用于任何操作系统。
    • )结束非捕获组。
  • *?重复上一项(?:.|\r?\n),零次或多次,尽可能少次。
  • \\*与文字字符*匹配。
  • /与文字字符\匹配。

根据您实施正则表达式的方式,您还可以使用Pattern的{​​{1}}标记和正则表达式

DOTALL

例如:

/\*\*.*?\*/

使用带有public static Pattern compile(String regex, int flags)标记的DOTALL方法。