我正在尝试从文本中提取IP地址,并且根据我写的正则表达式不理解结果。显然这个:
echo '"IPAddress": "173.14.0.3",' | sed -n -r -e 's/"IPAddress": "(.*)"/\1/p'
返回
173.14.0.3,
为什么我最后会得到,
?不"(.*)"
指示正则表达式在最后两个"
之间创建匹配的所有内容吗?
最初我是从
开始的echo '"IPAddress": "173.14.0.3",' | sed -n -r -e 's/"IPAddress": "([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})"/\1/p'
,但结果相同。我使用regex101,然后我得到了不同的回复。为什么呢?
答案 0 :(得分:2)
您的意见:
input: "IPAddress": "173.14.0.3",
matched by regex: ^^^^^^^^^^^^^^^^^^^^^^^^^ (note: comma not matched)
captured: ^^^^^^^^^^
匹配的部分被捕获的子字符串替换并替换回原始字符串,产生:
result: 173.14.0.3,
not affected: ^
replacement: ^^^^^^^^^^
如果你想摆脱逗号,请将它包含在匹配中(因此它不会被替换):
s/"IPAddress": "(.*)",/\1/p
regex101显示了相同的行为:https://regex101.com/r/Fy5Lj3/4
答案 1 :(得分:0)
一般建议:regex101.com 不支持sed
支持的正则表达式语言。这些在POSIX
规范中进行了解释。
虽然简单的事情可能看起来很相似,但表达式明显不同。处理sed
的正则表达式时,不使用regex101。