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]+
(?<!\#)
忽略前面有 #
的结果
(?<!\#\s)
忽略前面有 #
的结果
(?<!\w)
忽略前面有任何其他单词字符的结果(如 [a-zA-Z0-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
小上下文:我正在使用 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]+
(?<!\#)
忽略前面有#
的结果
(?<!\#\s)
忽略前面有#
的结果
(?<!\w)
忽略前面有任何其他单词字符的结果(如[a-zA-Z0-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