问题描述
- 请教各位大牛,正则表达式匹配结果的筛选问题
-
请教各位大牛,用正则表达式从配置文件里匹配IP地址“10.46.178.77”,现在需要将第一个匹配结果的IP修改为108.38.105.14,注释中的不修改。该怎么做?<IPvX>4</IPvX> <localIP>localhost</localIP> <seedcount>1</seedcount> <seedport>7000</seedport> <s0>10.46.178.77</s0> <!-- sample of 3 seeds --> <!-- <seedcount>3</seedcount> <seedport>7000</seedport> <s0>10.46.178.77</s0> <s1>10.46.178.78</s1> <s2>10.46.178.79</s2> -->
解决方案
用这样的正则表达式,会把匹配到的所有结果都修改掉,会误改不需要改的配置
ip=108.38.105.14
sed -i "s/10.46.178.77/$ip/g" $link_config_xml
解决方案二:
不知道你在什么环境下用的正则,正则一般替换的函数replace都有一个参数是限制替换次数的
比如php:
$p = /[b]/
$r = "a"
echo preg_replace($p,$r,"bbbb",1) 这样就只替换第一个b了
解决方案三:
不知道你什么语言,以下代码在C#下是测试通过的
str=Regex.Replace(str,@"(?s)(?<!<!--[^-]*)d+.d+.d+.d+(?![^-]*-->)","108.38.105.14");
解决方案四:
像这种需求,你用libxml来解析xml,然后xpath获取这个tag的一个链表,然后取第一个元素来修改就可以满足你的需求
这比正则表达式更清晰,准确,也不容易出错。
时间: 2025-01-01 23:43:34