如何在正则表达式模式中添加多个忽略单词

3
任何建议针对以下模式:
^FILE\s+(myapps.*[^build-]?(Ess\.xml)) [A-Z0-9:]*\d$

以上模式将使我得到以“FILE”开头并包含“myapps”的行,后跟任何字符但不应包含单词“build-”或“someword”,并以“Ess.xml”结尾。我能够构建该模式,但无法添加多个要忽略的单词,即“build_”和“someword”。
以下是几个示例:
  1. FILE myapps/abc/dfe/asd123123/sad/abcdEss.xml ABCD123:234234:AAS234:1
  2. FILE myapps/efgh/qwe/advd123123/qwreqar/bad/dsgEss.xml C03858:BC4E4A:1
  3. FILE efgh/qwe/advd123123/bad/abcd.xlf C03858:BC4E4A:1 - 无效,因为在FILE后没有以“myapps”开头
  4. DIR myapps/yry/hjkyi/qweq/tyu/somefile_taskmenu.xml EWEF123SSD:234WEEDWE234:AASJH234:1 - 无效,因为不是以FILE开头
  5. FILE myapps/efgh/qwe/advd123123/bad/build-dsgEss.xlf C03858:BC4E4A:1 - 无效,因为在单词build-dsgEss.xlf中包含build-
  6. FILE myapps/abc/dfe/someword/sad/abcdEss.xml ABCD123:234234:AAS234:1 - 无效,因为包含单词noship

你不想在字符串中或者fusionapps之后出现build-或者someword吗? - Rohit Jain
2
只是让你知道,[^build-]并不意味着“非构建-”,它的意思是“不是b || u || i || l || d || -”。 - David Starkey
请注意,符号 [^build-]? 是一个字符类,指定了除了 build- 之外的任意字符出现 0 次或 1 次;这与“不包括 build-”完全不同。而且,进行否定词的处理最好要谨慎小心。 - Jonathan Leffler
@RohitJain 是的,我不想在字符串中包含“build-”或“someword”。 - user2589079
1个回答

3
你的正则表达式有点错误 - 你错误地使用了字符类。这个术语:
[build-]

“字符类”是指“列出的任何单个字符”,这不是你想要的。

符合你要求的正则表达式(作为Java字符串)是:

"^(?!.*build-)(?!.*someword)FILE\\s+fusionapps.*Ess\\.xml [A-Z0-9:]+:\\d$"

此正则表达式使用两个锚定的负向先行断言来确定字符序列不会出现在输入的任何位置。
在rubular上看到您的示例匹配正确的实时演示

你应该解释一下。而且,“正则表达式”这个说法有点夸张,你确定它是唯一能完成工作的正则表达式吗? - Jonathan Leffler
@JonathanLeffler 很好的观点(还有一个很好的词“浮夸”!)。肯定有很多种方法可以解决这个问题。我把我的措辞改成了“A”正则表达式。 - Bohemian
@Bohemian,是的,我需要忽略那些包含单词build_和someword的行,而不是字符b u i l d _。但是你给出的正则表达式对我也不起作用,会出现语法错误。 - user2589079
@Bohemian,语法错误是因为你在结尾缺少了一个括号)。但是它并没有匹配模式。这里是应该匹配但未匹配的示例条目。 - user2589079
你的示例非常好 - 我已经更新了正则表达式。另外请查看演示链接。通常用示例来解释比用文字更容易和更好。如果正则表达式还有问题,请告诉我。 - Bohemian
显示剩余4条评论

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