匹配线没有和小写字母

时间:2011-06-07 21:27:36

标签: regex

我想匹配两个连续的行,第一行没有小写字母,第二行有小写字母,例如

("3.2 A MEMORY ABSTRACTION: ADDRESS SPACES 177" "#205")
("3.3.1 Paging 187" "#215")

为什么正则表达式^(?!.*[:lower:]).*$\n^(.*[:lower:]).*$会匹配以下两行示例?

("1.3.3 Disks 24" "#52")
("1.3.4 Tapes 25" "#53")

("1.5.4 Input/Output 41" "#69")
("1.5.5 Protection 42" "#70")

("3.1 NO MEMORY ABSTRACTION 174" "#202")
("3.2 A MEMORY ABSTRACTION: ADDRESS SPACES 177" "#205")

("3.3.1 Paging 187" "#215")
("3.3.2 Page Tables 191" "#219")

谢谢和问候!


增加:

例如:

("3.1 NO MEMORY ABSTRACTION 174" "#202")
("3.2 A MEMORY ABSTRACTION: ADDRESS SPACES 177" "#205")
("3.3.1 Paging 187" "#215")
("3.3.2 Page Tables 191" "#219")

我如何只匹配中间两行而不是前三行或全部四行?

2 个答案:

答案 0 :(得分:2)

使用Rubular,我们可以看到what's matched by your initial expression,然后添加一些超额捕获组see why it matches

基本上,.*后面的否定前瞻将匹配任何内容。如果您只想检查第一行是否没有小写字母,请明确检查,例如

^(?:[^a-z]+)$

最后,我假设您想要整个第二行,您可以在第二部分执行此操作:

^(.*?(?=[:lower:]).*?)$

或者匹配您的初始版本:

^(.*?(?=[:lower:])).*?$

似乎有必要采用不情愿的限定符(*?)来避免跨行匹配。

我最终得到的最终版本是:

^(?:[^a-z]+)$\n^(.*?(?=[:lower:]).*?)$

您可以在测试数据here中看到这一点。它只捕获行("3.2 A MEMORY ABSTRACTION: ADDRESS SPACES 177" "#205")

显然,我使用的正则表达式可能非常特定于Ruby,因此使用正则表达式引擎进行测试可能会有所不同。有很多很容易在Google上进行的在线正则表达式测试,我刚刚选择了Rubular,因为它可以很好地突出显示匹配的内容。

顺便提一下,如果你正在使用Python,那么Python Regex Tool对于Python正则表达式的在线测试非常有用(并且它适用于我上面提供的最终版本),尽管我发现输出在视觉上对帮助不太有帮助-shooting。


在考虑了一点之后,艾伦·摩尔(Alan Moore)关于[[:lower:]]的观点就是现实,关于数据如何匹配的观点也是如此。回想一下我写的内容,我有点过分参与破坏正则表达式并错过了所描述的问题。如果你修改我上面给出的正则表达式:

^(?:[^[:lower:]]+)$\n^(.*?(?=[[:lower:]]).*?)$

它只匹配行("3.3.1 Paging 187" "#215"),它是唯一一行,后面带有小写字母的行,没有小写字母,为can be seen here。将捕获组放置在Alan的表达式中,产生^(?!.*[[:lower:]]).+\n((?=.*[[:lower:]]).*)$ likewise captures the same text,但确切地匹配的是不同的。

我仍然没有很好的解决方案来匹配多行。

答案 1 :(得分:2)

要使用像[:lower:]这样的POSIX“字符类”,必须将其括在另一组方括号中,如下所示:[[:lower:]]。 (根据POSIX,外部括号组形成括号表达式[:lower:]字符类,但对于其他人,外括号定义字符类,内部[:lower:]已过时。)

正则表达式的另一个问题是第一部分不需要使用任何字符;一切都是可选的。这意味着你的比赛可以从空白行开始,我认为你不想这样。将第二个.*更改为.+会修复此问题,但这只是一个快速补丁。

此正则表达式似乎符合您的规范:

^(?!.*[[:lower:]]).+\n(?=.*[[:lower:]]).*$

但我有点困惑,因为你的样本数据中没有任何东西可以匹配。应该有吗?