我正在尝试编写一个匹配某个单词的正则表达式,该单词前面没有2个破折号( - )或斜杠和星号(/ *)。我尝试了一些表达,但似乎都没有。
以下是我正在测试的文字
a_func(some_param);
/ *评论初始化* /
初始化;
我正在尝试编写一个仅与最后一行中的单词init
匹配的正则表达式,我到目前为止所尝试的正在匹配init
中的单词initialization
最后一行,我试图查找现有答案,并发现使用了否定前瞻,但仍然在init
中匹配initialization
。以下是我试过的表达式:
(?!\/\*).*(init)
[^(\-\-|\/\*)].*(init)
(?<!\/\*).*(init)
在阅读regex101的快速参考资料时,我发现这种负面的背后隐藏,我相信它有一个与我需要的相似的例子,但我仍然无法得到我想要的东西,我应该看看进入负面的背后更多还是这不是我如何实现我想要的?我对正则表达的了解并不是那么广泛,所以我不知道我想要与否的可能性,但它是否可行?
答案 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