Regex 不带小写字母和带小写字母的匹配行

Regex 不带小写字母和带小写字母的匹配行,regex,Regex,我想匹配两个连续的行,第一行没有小写字母,第二行有小写字母,例如 为什么正则表达式^(?。*[: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.

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

为什么正则表达式
^(?。*[: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")
如何只匹配中间的两行,而不是前三行或全部四行?

使用,我们可以看到,然后,通过添加一些多余的捕获组

本质上,后面紧跟着
*
的消极前瞻将匹配任何东西。如果您只想检查第一行是否没有小写字母,请明确检查,例如

^(?:[^a-z]+)$
最后,我假设您需要整个第二行,您可以为第二部分执行此操作:

^(.*?(?=[:lower:]).*?)$
或与您的初始版本相匹配:

^(.*?(?=[:lower:])).*?$
不情愿的限定符(
*?
)似乎是避免跨行匹配所必需的

因此,我得出的最终版本是:

^(?:[^a-z]+)$\n^(.*?(?=[:lower:]).*?)$
这可以在测试数据中看到。它只捕获行
(“3.2 A内存抽象:地址空间177”“#205”)

显然,我使用的正则表达式可能非常特定于Ruby,因此使用正则表达式引擎进行测试可能会有所不同。有许多易于谷歌搜索的在线正则表达式测试,我只是选择了Rubular,因为它在突出匹配内容方面做得很好

顺便说一句,如果您使用的是Python,则对于Python正则表达式的在线测试非常有用(它与我上面给出的最终版本一起工作),尽管我发现输出在解决问题方面没有那么明显的帮助


在仔细考虑之后,艾伦·摩尔关于
[[:lower:]
的观点非常正确,他关于数据如何匹配的观点也是如此。回顾我写的东西,我有点太过关注正则表达式的分解,并且遗漏了关于所描述的问题的一些内容。如果您修改我在上面给出的正则表达式:

^(?:[^[:lower:]]+)$\n^(.*?(?=[[:lower:]]).*?)$
它只匹配行
(“3.3.1 Paging 187”“#215”)
,这是在没有小写字母的行之后唯一一行小写字母,如下所示。在Alan的表达式中放置一个捕获组,产生
^(?。*[:lower:].+\n((?=.[:lower:]]).$
,尽管匹配的内容是不同的

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

使用,我们可以看到,然后,通过添加一些多余的捕获组

本质上,后面紧跟着
*
的消极前瞻将匹配任何东西。如果您只想检查第一行是否没有小写字母,请明确检查,例如

^(?:[^a-z]+)$
最后,我假设您需要整个第二行,您可以为第二部分执行此操作:

^(.*?(?=[:lower:]).*?)$
或与您的初始版本相匹配:

^(.*?(?=[:lower:])).*?$
不情愿的限定符(
*?
)似乎是避免跨行匹配所必需的

因此,我得出的最终版本是:

^(?:[^a-z]+)$\n^(.*?(?=[:lower:]).*?)$
这可以在测试数据中看到。它只捕获行
(“3.2 A内存抽象:地址空间177”“#205”)

显然,我使用的正则表达式可能非常特定于Ruby,因此使用正则表达式引擎进行测试可能会有所不同。有许多易于谷歌搜索的在线正则表达式测试,我只是选择了Rubular,因为它在突出匹配内容方面做得很好

顺便说一句,如果您使用的是Python,则对于Python正则表达式的在线测试非常有用(它与我上面给出的最终版本一起工作),尽管我发现输出在解决问题方面没有那么明显的帮助


在仔细考虑之后,艾伦·摩尔关于
[[:lower:]
的观点非常正确,他关于数据如何匹配的观点也是如此。回顾我写的东西,我有点太过关注正则表达式的分解,并且遗漏了关于所描述的问题的一些内容。如果您修改我在上面给出的正则表达式:

^(?:[^[:lower:]]+)$\n^(.*?(?=[[:lower:]]).*?)$
它只匹配行
(“3.3.1 Paging 187”“#215”)
,这是在没有小写字母的行之后唯一一行小写字母,如下所示。在Alan的表达式中放置一个捕获组,产生
^(?。*[:lower:].+\n((?=.[:lower:]]).$
,尽管匹配的内容是不同的

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

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

正则表达式的另一个问题是,第一部分不需要使用任何字符;一切都是可选的。这意味着你的比赛可以在空白线上开始,我不认为你希望如此。将第二个
*
更改为
+
可以解决这个问题,但这只是一个快速补丁

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

^(?!.*[[:lower:]]).+\n(?=.*[[:lower:]]).*$
但我有点困惑,因为您的示例数据中没有匹配的内容。是否应该有?

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

正则表达式的另一个问题是,第一部分不需要使用任何字符;一切都是可选的。这意味着你的比赛可以在空白线上开始,我不认为你希望如此。将第二个
*
更改为
+
可修复此问题,