如何匹配不以某个子字符串结尾的字符串?

时间:2010-07-05 10:35:56

标签: regex

如何编写最终不包含某些字符串的正则表达式。 在我的项目中,他们的名字不以某些字符串结尾的所有类如“controller”和“map”都应该从基类继承。我怎么能用正则表达式做到这一点?


但同时使用

public*.class[a-zA-Z]*(?<!controller|map)$ 
public*.class*.(?<!controller)$ 

没有任何匹配案例!!!

5 个答案:

答案 0 :(得分:6)

搜索与此匹配的所有文件名:

(?<!controller|map|anythingelse)$

(如果没有其他关键字,请移除|anythingelse,或者同样附加其他关键字。)

如果你不能使用负面的lookbehinds((?<! .. )位),请搜索 not 匹配的文件名:

(?:controller|map)$

如果仍然不起作用(某些IDE中可能没有),请删除?:部分,它可能会 - 这只是使它成为非捕获组,但这里的差异相当微不足道。

如果您使用的是完整字符串必须匹配的内容,那么您可以使用^.*前面的任何一个作为前缀。


更新

回应:

  

但同时使用两个       public*.class[a-zA-Z]*(?<!controller|map)$
      public*.class*.(?<!controller)$
  没有任何匹配案例!!!

不太确定你在那里尝试使用公共/类的东西,所以试试这个:

public.*class.*(?<!controller|map)$`

.是一个正则表达式字符,表示“除换行符之外的任何内容”,而*表示零次或多次。

如果这不是你想要的,请编辑问题并提供更多详细信息。

答案 1 :(得分:2)

根据您的正则表达式实现,您可以使用lookbehind来执行此任务。这看起来像

(?<!SomeText)$

这匹配任何末尾没有“SomeText”的行。如果你不能使用它,表达式

^(?!.*SomeText$).*$

匹配任何不以“SomeText”结尾的非空行。

答案 2 :(得分:1)

你可以编写一个包含两个组的正则表达式,一个由控制器或地图之前的一个或多个字符组成,另一个包含控制器或地图,是可选的。

^(.+)(controller|map)?$

使用它可以匹配您的字符串,如果您使用的正则表达式API中有group()方法,如果group(2)为空,则该字符串不包含控制器或地图。

答案 3 :(得分:-1)

检查名称是否与[a-zA-Z] *控制器或[a-zA-Z] *地图不匹配。

答案 4 :(得分:-1)

最后我以这种方式做到了

public.*class.*[^(controller|map|spec)]$

它有效