使用 ICU 定义正则表达式负向后视的界限

Defining the bounds for a regex negative look behind with ICU

我有如下模式

header line
  a = b
  c = d
  c = e
  f = g

我想到了模式

std::string pat = 
"((.*)(\n|\r\n)(\s|\t)*?(?<name>([a-z]{1,100}))\s+=)"
"((.*)(\n|\r\n)(\s|\t)*?(?<!\k<name>{1,100})\s+=)";

使用 ICU's regex 我得到 U_REGEX_LOOK_BEHIND_LIMIT。 我认为 {1,100} 是我需要的,但没有效果。我如何才能看到我给出的限制?

或者有更简单的方法吗?如果不清楚,我想要一个模式,只要一行的第一个单词与上一行的第一个单词不同,它就会匹配,所以它会在遇到 c = d 和遇到 [=15= 时再次匹配] 但不会 c = e.

试试这个正则表达式:

^\h*(?<name>\w++)\h*=.*\R(?=\h*(?<good>(?!\k<name>\b)\w++\h*=.*$))

DEMO

我基本上颠覆了你的解决方案。我以正常方式匹配 previous 行,然后先行匹配 current 行。前瞻让我在不推进当前匹配位置的情况下查看整行。这就是为什么下一次匹配尝试从下一行开始,而不是下一行。

尽管前瞻不会消耗 它匹配的内容,您仍然可以捕获 组中匹配文本的部分。在这里,我捕获了名为 good.

的组中的当前行

关于我的一些其他更改的一句话:\R 是平台中立的换行符构造,它比 (\n|\r\n) 更健壮。 \h 匹配水平白色space 字符,如 spaces 和 TAB,但不匹配垂直白色 space,如换行符和回车符 returns。请注意 \h(\s|\t) 不同。许多新用户假设 \s 仅匹配 space 字符,但它实际上匹配 any 白色 space 字符,水平或垂直。

这是作为 C 字符串文字的正则表达式:

"(?m)^\h*(?<name>\w++)\h*=.*\R(?=(?<good>\h*(?!\k<name>\b)\w++\h*=.*$))"

请注意,它在第一行不起作用,但我假设它不需要。