RegEx - 从匹配中排除字符序列

3
我在处理一个正则表达式时遇到了困难,希望在这里寻求一些指导。我已经在这里和Google上搜索过了,但很难找到正确的术语。我可以想象非捕获组会对我有所帮助,但我不知道如何应用它们。
基本上,我想要查找Java单行注释,这些注释是“尖叫”的(没有小写字母):
^[ \t]*//[^a-z]+?$

现在我也发现了这样的评论:
// PN-123456 
// ITK 12345
//IT-12345

这些评论对我有效,所以我想要将它们从上述正则表达式中排除。 它总是遵循以下模式:

  1. 可选的空格
  2. "PN" 或 "IT" 或 "ITK"
  3. 连字符、空格或无内容
  4. 四到六位数字
  5. 可选的空格

这就是我处理此模式的方法:

[ ]?PN[ -]?[0-9]{1,6}

但是现在我无法将两个表达式合并成一个正则表达式。这应该如何处理?谢谢,Peter。
1个回答

9

你需要一个负向预查

^//(?!\s*(?:PN|ITK?)[ -]?[0-9]{1,6}[ ]*$)[^a-z]+?$

请注意,[^a-z]+ 要求没有小写字母,但并不完全等同于“仅大写字母”。例如,它将捕获注释 // ----------,甚至是空的 //(只要有一个空格)。
示例:http://regexr.com?31app

太好了,完美!是的,我也想包括“无意义的注释”,例如空注释等。请允许我根据我给出的示例调整您的建议(负向先行断言应包括“//”)。仍然很棒。非常感谢 :-) 我将在将来的使用中查看先行断言主题。 - Peter Wippermann
@Peter - 我只是在测试它并添加了// - 它可以放在预读之前(当然也可以是\s*//)。谢谢! - Kobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接