首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不带小写字母的匹配行

不带小写字母的匹配行
EN

Stack Overflow用户
提问于 2011-06-07 21:27:35
回答 2查看 276关注 0票数 0

我想匹配连续两行,第一行没有小写字母,第二行有小写字母。

代码语言:javascript
复制
("3.2 A MEMORY ABSTRACTION: ADDRESS SPACES 177" "#205")
("3.3.1 Paging 187" "#215")

为什么Regex ^(?!.*[:lower:]).*$\n^(.*[:lower:]).*$会匹配以下两行示例中的每一个?

代码语言:javascript
复制
("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")

谢谢和问候!

加:

例如:

代码语言:javascript
复制
("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")

我怎样才能把中间的两条线和头三条线或者四条线都配起来呢?

EN

回答 2

Stack Overflow用户

发布于 2011-06-07 22:31:05

使用[医]风疹,我们可以看到您的初始表达式匹配的是什么?,然后,通过添加一些多余的捕获组,看看它为什么匹配

从本质上讲,.*后面的负面展望将与任何事物相匹配。如果您只想检查第一行没有小写字母,请显式地检查它。

代码语言:javascript
复制
^(?:[^a-z]+)$

最后,我假设您想要整个第二行,您可以在第二部分中这样做:

代码语言:javascript
复制
^(.*?(?=[:lower:]).*?)$

或者与你的原版相匹配:

代码语言:javascript
复制
^(.*?(?=[:lower:])).*?$

不情愿的限定符(*?)似乎是必要的,以避免跨行匹配。

因此,我最后得到的最后版本是:

代码语言:javascript
复制
^(?:[^a-z]+)$\n^(.*?(?=[:lower:]).*?)$

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

显然,我使用的regex可能非常特定于Ruby,因此使用regex引擎进行测试可能会有所不同。有许多易于谷歌在线regex测试,我只是选择了Rubular,因为它做了一个出色的工作,突出什么是匹配的。

顺便说一句,如果您正在使用Python,那么Python工具对于Python的在线测试非常有帮助(而且它适用于我上面给出的最终版本),尽管我发现输出在解决问题方面的帮助不大。

再仔细考虑一下,艾伦·摩尔( Alan )关于[[:lower:]]的观点就像他关于数据如何匹配的观点一样。回顾我所写的,我有点太投入于破坏正则表达式,而忽略了描述的关于这个问题的东西。如果您修改了我上面给出的正则表达式:

代码语言:javascript
复制
^(?:[^[:lower:]]+)$\n^(.*?(?=[[:lower:]]).*?)$

它只匹配行("3.3.1 Paging 187" "#215") (这是在没有小写字母的行后面只有小写字母的唯一行),如在这里可以看到。在Alan的表达式中放置一个捕获组,生成^(?!.*[[:lower:]]).+\n((?=.*[[:lower:]]).*)$ 同样地,捕获相同的文本。,尽管匹配的内容是不同的。

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

票数 2
EN

Stack Overflow用户

发布于 2011-06-08 02:37:00

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

regex的另一个问题是,第一部分不需要使用任何字符;所有内容都是可选的。这意味着你的比赛可以从空行开始,我认为你不想这样。将第二个.*更改为.+修复了这个问题,但它只是一个快速修补程序。

此正则表达式似乎与您的规范相匹配:

代码语言:javascript
复制
^(?!.*[[:lower:]]).+\n(?=.*[[:lower:]]).*$

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6271852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档