除某些字符之外的所有字符串的正则表达式

时间:2016-10-12 13:40:44

标签: java regex

我正在尝试编写一个匹配某个单词的正则表达式,该单词前面没有2个破折号( - )或斜杠和星号(/ *)。我尝试了一些表达,但似乎都没有。

以下是我正在测试的文字

  

a_func(some_param);

     

/ *评论初始化* /

     

初​​始化;

我正在尝试编写一个仅与最后一行中的单词init匹配的正则表达式,我到目前为止所尝试的正在匹配init中的单词initialization最后一行,我试图查找现有答案,并发现使用了否定前瞻,但仍然在init中匹配initialization。以下是我试过的表达式:

  • (?!\/\*).*(init)
  • [^(\-\-|\/\*)].*(init)
  • (?<!\/\*).*(init)在阅读regex101的快速参考资料时,我发现这种负面的背后隐藏,我相信它有一个与我需要的相似的例子,但我仍然无法得到我想要的东西,我应该看看进入负面的背后更多还是这不是我如何实现我想要的?

我对正则表达的了解并不是那么广泛,所以我不知道我想要与否的可能性,但它是否可行?

3 个答案:

答案 0 :(得分:1)

假设--/*init位于同一行,则有一些选项。正如评论者所说,多行评论可能需要更强大的技术。

我知道的最简单方法是实际预处理字符串以删除--.*$/\*.*$,然后查找init(或init\b如果您不想要匹配initialization):

String input = "if init then foo";
String checkme = input.replaceAll("--.*$", "").replaceAll("/\\*.*$", "");
Pattern pattern = Pattern.compile("init");  // or "init\\b"
Matcher matcher = pattern.matcher(checkme);
System.out.println(matcher.find());

你也可以在@ olsli的答案中使用负面的lookbehind。

答案 1 :(得分:0)

您可以从:

开始
String input = "/*init";
Pattern pattern = Pattern.compile("^((?!--|\\/\\*).)*init");
Matcher matcher = pattern.matcher(input);
System.out.println(matcher.find());

答案 2 :(得分:0)

我添加了更多大括号来分隔出来。这也应该有效,在Regexr和IDEONE中进行测试

Pattern p = Pattern.compile("^(?!=((\\/\\*)|(--)))([.]*?)init[.]*$", Pattern.MULTILINE|Pattern.CASE_INSENSITIVE);
String s = "/* Initialisation";
Matcher m = p.matcher(s);

m.find(); /* should return you >-1 if there's a match