快速入门
教程
工具和语言
示例
参考
书籍评论
示例
正则表达式示例
数字范围
浮点数
电子邮件地址
IP 地址
有效日期
数字日期转文本
信用卡号
匹配完整行
删除重复行
编程
两个相邻单词
陷阱
灾难性回溯
重复次数过多
拒绝服务
将所有内容设为可选
重复捕获组
混合 Unicode 和 8 位
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书籍评论
可打印 PDF
关于本网站
RSS 源和博客
RegexBuddy—The most comprehensive regular expression library!

匹配整行文本

通常,您希望匹配文本文件中的完整行,而不仅仅是满足特定要求的行部分。如果您想在 文本编辑器 中的搜索替换中删除整行,或在 信息检索工具 中收集整行,这将非常有用。

为了简化此示例,我们假设要匹配包含单词“John”的行。正则表达式 John 足以轻松找到这些行。但软件只会将 John 作为匹配项,而不是包含该单词的整行。

解决方案相当简单。为了指定我们需要整行,我们将使用 插入符号和美元符号,并启用选项使其在嵌入换行符时匹配。在旨在处理文本文件(如 EditPad ProPowerGREP)的软件中,插入符号始终在嵌入换行符时匹配。为了匹配我们原始正则表达式 John 匹配之前和之后的行部分,我们只需使用 星号。务必关闭点匹配换行符的选项。

生成的正则表达式为:^.*John.*$。您可以使用相同的方法将任何正则表达式的匹配扩展到整行或一组完整行。在某些情况下,例如使用交替时,您需要使用括号将原始正则表达式分组。

查找包含或不包含某些单词的行

如果一行可以满足一系列要求中的任何一个,只需在正则表达式中使用交替^.*\b(one|two|three)\b.*$匹配包含单词“one”、“two”或“three”中的任何一个的完整文本行。第一个反向引用将包含该行实际包含的单词。如果它包含多个单词,则最后一个(最右边的)单词将被捕获到第一个反向引用中。这是因为星号是贪婪的。如果我们使第一个星号变为惰性,就像^.*?\b(one|two|three)\b.*$中一样,则反向引用将包含第一个(最左边的)单词。

如果一行必须满足多个要求,我们需要使用环视^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$匹配包含单词“one”、“two”和“three”全部的完整文本行。同样,锚点必须与行首和行尾匹配,不能匹配换行符。由于插入符号和环视的长度为零,所有三个环视都在每行的开头尝试。每个环视都将匹配单行上的任何文本片段(.*?),后跟单词之一。所有三个都必须成功匹配才能匹配整个正则表达式。请注意,您可以将任何正则表达式(无论多么复杂)放在环视中,而不是像\bword\b这样的单词。最后,.*$导致正则表达式在环视确定它满足要求后实际匹配该行。

如果你的条件是一行应该包含某些内容,请使用否定前瞻。 ^((?!regexp).)*$ 匹配不匹配 regexp 的完整行。请注意,与以前使用肯定前瞻不同,我将否定前瞻和点一起重复。对于肯定前瞻,我们只需要找到一个可以匹配的位置。但否定前瞻必须在行中的每个字符位置进行测试。我们必须测试 regexp 在任何地方都失败,而不仅仅是在某个地方。

最后,你可以将多个肯定和否定要求组合如下: ^(?=.*?\bmust-have\b)(?=.*?\bmandatory\b)((?!avoid|illegal).)*$。在检查多个肯定要求时,正则表达式末尾的 .* 充满了零长度断言,确保我们实际上匹配了某些内容。由于否定要求必须匹配整行,因此很容易用否定测试替换 .*