RegEx 忽略任何位置以 # 开头的结果

RegEx to ignore results preceeded by # in any position

小上下文:我正在使用 POSIX regex library 在 C 中编码一些 RegEx 字符串替换。 (感谢@Jonathan Leffler 的澄清)

我已经设法完成了实际替换的代码,但我正在努力处理 RegEx 本身。

我的目标是在一个长字符串中找到一个单词(即'parameter')(它实际上是一个文件读取并存储为字符串)。我知道这个词在一行上,但它前面或后面可能有其他字符,我想忽略在单词第一个字母之前的任何位置以 # 开头的所有结果 包含我考虑过的所有案例的示例:

# default parameter
parameter=3
someparameter=3
a parameter=3
###parameter=3
# ## parameter=3
## # parameter=3
#       parameter=3
#      parameter=3
something something #   parameter=3
         parameter=3
#something parameter=3
# something parameter=3
parameter=#3
parameter=

我很快找到了适用于标准情况的东西:^\s+parameter=[0-9]+,然后继续调整它以实现我想要的。

经过大量必要的研究后,我最终使用了负面回顾,同时还发现插入符号 ^ 无法正常工作 因为这个词是不在字符串的开头(同样是文件的开头)。

现在我在这:

(?<!\#)(?<!\#\s)(?<!\w)parameter=[0-9]+

但如您所见here,它仍然匹配一些以#.

开头的单词

有什么方法可以实现我所描述的吗?

一个很好的方法是捕获任何前导空格(如果有的话),但是 只有在 之前没有 # 的情况下。但这对我来说不是严格要求,我也可以随他们去。

编辑:按照@Blindy 的建议,这是我想做的

匹配“参数”的行示例

parameter=1
a parameter=12
parameter=345 # some comment
      parameter=4
parameter=5 ####

不匹配

#parameter=0
# parameter=11
something # parameter=22
# something else parameter=3333
### something parameter=4312
#      parameter=543

如果您正在从文件(或标准输入)中读取行,处理注释的正常方法是使用 strchr() 找到注释的开头来删除它们:

char *hash = strchr(line, '#');
if (hash != NULL)
    *hash = '[=10=]';

或使用strcspn():

line[strcspn(line, "#")] = '[=11=]';`

如果您将换行符添加到 strcspn() 的第二个参数中,您也可以(或代替)切换换行符。

然后应用一个不需要 look-behind 的简单正则表达式来查找您感兴趣的信息。如果需要,请复制该行。

如果您愿意,可以使用 [[:space:]]*# 等正则表达式来查找要删除的位置;这也去除了 # 之前的所有空格。不过,这可能不是必需的。

当你给出一个正则表达式的示例行列表时,你应该说出你期望它们会发生什么,因为你的问题中的内容完全无法使用。

考虑到这一点,我猜测你想要的东西就是这样:

^[^#]*?\b(parameter=[0-9]+)

即任何不以 # 开头的参数表达式。您可以在此处查看实际效果:https://regex101.com/r/a21ram/1