首页 > 解决方案 > 正则表达式过滤掉字符串

问题描述

我正在使用下面的正则表达式过滤掉字符串

^(?!.*(P1 | P2)).*groupName.*$

这里的组名是我在运行时替换的特定字符串。这个正则表达式已经运行良好。

我有两个输入字符串需要从此正则表达式传递。无法更改^(?!.*(P1 | P2))正则表达式的一部分,因此只想在此部分之后更改正则表达式。它是一个非常通用的正则表达式,在很多地方都在使用,所以我只有一个地方可以更改是groupName正则表达式的一部分。有没有办法只有2字符串可以通过这个正则表达式?

1) ADMIN-P3-UI-READ-ONLY
2) ADMIN-P3-READ-ONLY

在正则表达式groupName中只是一个变量,它将在运行时用所需的字符串替换。在这种情况下,我希望2传递字符串,因此groupName可以替换部分,READ-ONLY但它也会传递1字符串。

任何人都可以建议如何使这项工作?

标签: javaregex

解决方案


您可以在模式的最开始添加另一个前瞻,以进一步限制它匹配的内容,因为您的模式属于“匹配一切但”类型。

所以,它可能看起来像

String extraCondition = "^(?!.*UI)";
String regex = "^(?!.*(P1|P2)).*READ-ONLY.*$";
String finalRegex = extraCondition + regex;

图案看起来像

^(?!.*UI)^(?!.*(P1|P2)).*READ-ONLY.*$

匹配

  • ^(?!.*UI) -UI除了换行符之外的任何零个或多个字符后没有,从字符串的开头尽可能多
  • ^(?!.*(P1|P2))-除了换行符之外的任何零个或多个字符之后,从字符串的开头尽可能多地没有P1,也没有P2
  • .*READ-ONLY- 尽可能多的除换行符以外的任何零个或多个字符,然后READ-ONLY
  • .*$- 字符串的其余部分。请注意$,除非您想确保输入字符串中没有多余的行,否则您可以安全地删除此处。

推荐阅读