使用 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*=.*$))
我基本上颠覆了你的解决方案。我以正常方式匹配 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*=.*$))"
请注意,它在第一行不起作用,但我假设它不需要。
我有如下模式
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*=.*$))
我基本上颠覆了你的解决方案。我以正常方式匹配 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*=.*$))"
请注意,它在第一行不起作用,但我假设它不需要。