在正则表达式中排除多个字符

时间:2018-03-25 15:13:16

标签: java regex

如何一次排除多个字符。

我需要编写可以检查java多行注释是否没有结束的正则表达式。

例如两条评论

/* some comment */

/* Multi line comment start

正则表达式代码必须与第二条评论匹配,但不能与第一条评论匹配。

我试过像

这样的东西
\/\*(.*)[^\*\/]

但这只排除了一个角色。如何一次排除两个。

4 个答案:

答案 0 :(得分:1)

一种解决方案是使用*上的.(?!\*\/)量词:

^\/\*(?:.(?!\*\/))*$

这意味着只要在要匹配的内容之后没有*/,它就会匹配任何内容。

Demo

然而,这需要很多步骤。如果我是你,我会在*/之前和之后匹配评论,并将*/部分放在一个组中。如果该组存在,那么它结束,否则评论没有结束。

答案 1 :(得分:0)

TL; DR,这是不可能的

因为在面对未闭合的多行注释块时您不知道应该匹配多少行。因为您不知道/*是否放在字符串文字或结尾*/分隔符内。但是如果你想匹配/*所在的一行(当前行),你可以这样做:

(?m)^\h*/\*(?!(?>(?!/\*)[\s\S])*\*/).*

Live demo

故障:

  • (?m)启用多行修饰符
  • ^断言行开头
  • \h*匹配horizental空格(如果有的话)
  • /\*匹配多行注释块的开头
  • (?!开始否定前瞻
    • (?>开始原子分组
      • (?!/\*)如果接下来的两个字符不是/ *
      • [\s\S]匹配下一个字符
    • )*重复尽可能多的
    • \*/匹配块结束
  • )否定前瞻结束
  • .*匹配当前行中的所有内容

Java代码:

String regex = "(?m)^\\h*/\\*(?!((?!/\\*)[\\s\\S])*\\*/).*";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

Java live demo

答案 2 :(得分:0)

您可以使用负向lookbehind来断言*/不在行的末尾:

^\/\*.*(?<!\*\/)$

请参阅此demo

答案 3 :(得分:0)

Do you want something like this?

\/\*\s*((?!\*\/|\/\*)[\s\S])*(?=\/\*|$)

Demo

             \/\*\s*    :  matching the start of multi-line comment
          (?=\/\*|$)    :  ending pattern (new comment start \/* or end of the text $ )
((?!\*\/|\/\*)[\s\S])*  :  stop present matching process and start new one when meets */ or \/* 

[Test sample text]

/* some c
omment */
/* Multi line comment start
 fdsafdsa
/*

/* fds

sa */

/* fjdslajfdl 

/*fjdl  */  /* fjdls
fjdls
/*  */   /*fdls
jfdla*/  /* fdlsajfl

fdsa
/*end*/