如何匹配不以特定子字符串结尾的字符串?

3
如何编写不包含某个字符串结尾的正则表达式?在我的项目中,所有类的名称都不应以某些字符串结尾,例如“controller”和“map”,这些类应该继承自一个基类。如何使用正则表达式实现这一点?
public*.class[a-zA-Z]*(?<!controller|map)$ 
public*.class*.(?<!controller)$ 

没有任何匹配项!!!


8
请务必注明你正在使用的正则表达式引擎。 - polygenelubricants
5个回答

6

搜索所有文件名匹配此项:

(?<!controller|map|anythingelse)$

如果没有其他关键字,请删除|anythingelse,或类似地添加其他关键字。

如果无法使用负回溯(即(?<!..)),请搜索不符合以下条件的文件名:

(?:controller|map)$

如果这仍然不起作用(在一些IDE中可能不起作用),请删除?:部分,那么它可能会起作用 - 这只是使其成为一个非捕获组,但这里的差别相当微小。

如果您正在使用必须完全匹配的内容,则可以在上述任何一个前面加上^.*来执行此操作。

更新:

针对以下内容的回应:

但使用以下两个表达式没有匹配的情况!!!
public*.class[a-zA-Z]*(?<!controller|map)$
public*.class*.(?<!controller)$

不太确定您在尝试什么公共/类相关的内容,所以请尝试这个:
public.*class.*(?<!controller|map)$`
< p > . 是一个正则表达式字符,表示“除换行符之外的任何字符”,而< code > * 表示零次或多次。

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


类名可以是任何东西,只是不能以“controller”或“map”结尾。例如,在结果中,我希望看到public class class1,而不是public class class1controller。 - adrakadabra
1
@adracadabra:这是你应该放在问题中而不是回答评论中的内容。欢迎来到全新不同的StackOverflow世界 :)(OT: aBracadabra发生了什么?) - Tim Pietzcker
1
adrakadabra,你在使用这个正则表达式的时候是用哪种语言或工具? - Peter Boughton

2

根据您的正则表达式实现,您可能可以使用后顾(lookbehind)来完成此任务。这将如下所示:

(?<!SomeText)$

这将匹配任何结尾不包含"SomeText"的行。如果您无法使用该方法,则可以使用以下表达式。
^(?!.*SomeText$).*$

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


4
你的第二个正则表达式在字符串中出现 SomeText 时会失败,因此太过严格。 - Tim Pietzcker

1
你可以编写一个正则表达式,其中包含两个组,一个由控制器或映射之前的一个或多个字符组成,另一个包含控制器或映射并且是可选的。
^(.+)(controller|map)?$

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


-1

检查名称是否不匹配 [a-zA-Z]*controller 或 [a-zA-Z]*map。


1
这太过严格了-谁知道在字符串中是否允许ASCII字母之外的其他字符? - Tim Pietzcker
使用以下正则表达式: public*.class[a-zA-Z](?<!controller|map)$ public.class*.(?<!controller)$ 没有匹配的情况!!! - adrakadabra

-1

最终我是这样做到的

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

它运行成功了


当字符串结尾是以下字符串之一时,如"controller"、"coco"或"contr",请拒绝正则表达式。 - Jeus

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