当前位置: 首页 > 知识库问答 >
问题:

为什么我的 pcregrep 正则表达式中的积极展望不起作用?

颜永怡
2023-03-14

我用pcregrep写了一个正则表达式,一切都按预期进行,直到我添加了一个积极的前瞻。

场景:

我有以下文本文件:

a
b
c
a
c

目标:

我想在pcregrep中使用Regex来返回包含a的行和包含c的行,以及它们之间包含b的行未被捕获。因此,它将捕获前三行(abc)并返回第一行(a)和第三行(c)。它不会捕获第四行和第五行,因为它们之间没有b行。因此输出将是:

a
c

我尝试过的

如果我运行 pcregrep -M 'a\nb\nc\n'(命令 1),这将捕获并返回:

a
b
c

不出所料。所以我现在想修改它,用一个积极的前瞻来捕捉< code>b行。我试过这个:< code>pcregrep -M 'a\n(?=(b\n))c\n'(命令2)。但是,这不会返回任何内容。

我的问题:

为什么命令2不返回预期输出,而命令1会返回?如何返回期望的结果?我知道除了pcgreep之外,还有其他方法可以做到这一点,但请注意,我希望使用PCgreep,因为我将扩展该功能以解决类似问题。

谢谢你!

共有2个答案

姚淳
2023-03-14

为什么命令2不返回预期输出,而命令1会返回?因为命令2是不同的表达式

(?=...是零宽度展望

你指定的是:我想要一个a,后面跟着一个换行,后面跟着一个b,后面跟着一个换行。在那个位置我还想要一个c,后面跟着一个换行。

附言只是得到 a 和 c 也许这会有所帮助?

< code > pcregrep-M ' a \ nb \ NC \ n ' | pcregrep-M ' a | c '

皮自明
2023-03-14

您可以使用 -o 选项的 2 个捕获组:

pcregrep -M -o1 -o2 '(a\n)b\n(c)\n' file
a
c

细节:

    < li > <代码>(...):在regex中,它用于捕获组 < li> -o1 -o2:仅打印捕获组#1和#2

请注意,正则表达式a\n(?=(b\n))c\n不起作用,因为lookahead只是具有零宽度匹配的断言。正则表达式断言在a\n之后存在b\nb,这很好,但它会尝试在a\n之后立即匹配c\n,这就是匹配失败的地方。

 类似资料:
  • 问题内容: 我正在做一个小的javascript方法,该方法会接收到一个点列表,并且我必须阅读这些点才能在Google地图中创建多边形。 我在表格上收到这些要点: (lat,long),(lat,long),(lat,long) 因此,我完成了以下正则表达式: 我已经使用RegexPal和收到的确切数据进行了测试: 并且它可以正常工作,所以为什么当我在JavaScript中添加此代码后,结果中会收

  • 问题内容: 在下面的代码段中,匹配结果中的 非捕获组应被忽略, 结果应该是。 但是,我得到了匹配结果。仅当我指定group(2)时才显示。 问题答案: 并返回整个比赛。随后的组是实际的捕获组。 如果您想要相同的行为:

  • 问题内容: 试图了解正则表达式,我在重复的部分:。 我有以下代码: 如您所见,两个字符串都不匹配该模式。为什么会这样呢? 问题答案: 您不应该在逗号后加空格,这是多余的。

  • 我不知道为什么这个正则表达式不匹配。也许你能发现错误。 ficontents: 我想匹配>>>>>>客户端9462<<<<<捕获该号码,以及此后的所有内容,直到另一个客户端号码。所以我的第一个捕获是“9462”,第二个捕获是“Had a program exception;please check the error log”。 它使用JavaScript设置在regex101.com中工作得很好

  • 我要匹配以下字符串: 包含unicode空格(不要问我为什么)<代码>/,\s*,/u在regex101中工作正常。 但是(?u),\s*,“在clojure中不起作用: 为什么会失败?

  • 问题内容: 我知道进行解析时,我应该理想地删除所有空格和换行符,但是我只是为了快速解决此问题,所以不知道为什么它不起作用。带有“ #### 1”之类的包装器的文档,并尝试基于此进行解析,但是无论我尝试如何,它都无法正常工作,我认为我正确地使用了多行。 这根本不会返回任何结果: 问题答案: 尝试(当然也可以)。 此正则表达式将返回包含节号和节内容的元组。 对于您的示例,这将返回。 (顺便说一句:您的