Regexp使IP地址正常化(用零填充)

Regexp使IP地址正常化(用零填充),regex,ip-address,replace,Regex,Ip Address,Replace,我有一份日志文件的副本,希望更易于查看/编辑。 我使用textpad删除我不想要的内容,我可以输入正则表达式作为搜索词,并在捕获的组的目标字段中使用\1.\2.\3.\4。 我想更改每行起始的所有IP地址 [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 到 带填充前导零的 如何一次完成 输入示例: 10.2.123.4 110.12.23.40 123.123.123.123 1.2.3.4 示例输出 010.002.123.004 110.01

我有一份日志文件的副本,希望更易于查看/编辑。
我使用textpad删除我不想要的内容,我可以输入正则表达式作为搜索词,并在捕获的组的目标字段中使用\1.\2.\3.\4
我想更改每行起始的所有IP地址

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

带填充前导零的 如何一次完成

输入示例:

10.2.123.4
110.12.23.40
123.123.123.123
1.2.3.4
示例输出

010.002.123.004
110.012.023.040
123.123.123.123
001.002.003.004
看看我自己的答案是什么

感谢您的投入

吐在
,pad,加入。不需要正则表达式。Regex甚至不会提供任何好处

JavaScript,例如:

var ip = "110.12.23.40";

ip = ip.split(".").map( function(i) {
  return ("00"+i).slice(-3);
}).join(".");

alert(ip);  // 110.012.023.040

好的,我决定不止一次地去做。我把它贴在这里以备将来参考,或者万一有人想出一个正则表达式

注意,每个查找和替换都有一个尾随空格

^([0-9]{1})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) -> 00\1.\2.\3.\4 
^([0-9]{2})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) -> 0\1.\2.\3.\4 

^([0-9]{3})\.([0-9]{1})\.([0-9]{1,3})\.([0-9]{1,3}) -> \1.00\2.\3.\4 
^([0-9]{3})\.([0-9]{2})\.([0-9]{1,3})\.([0-9]{1,3}) -> \1.0\2.\3.\4 

^([0-9]{3})\.([0-9]{3})\.([0-9]{1})\.([0-9]{1,3}) -> \1.\2.00\3.\4 
^([0-9]{3})\.([0-9]{3})\.([0-9]{2})\.([0-9]{1,3}) -> \1.\2.0\3.\4 

^([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{1}) -> \1.\2.\3.00\4 
^([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{2}) -> \1.\2.\3.0\4 
Textpad语法:

^\([0-9]\{1\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\) -> 00\1.\2.\3.\4 
^\([0-9]\{2\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\) -> 0\1.\2.\3.\4 

^\([0-9]\{3\}\)\.\([0-9]\{1\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\) -> \1.00\2.\3.\4 
^\([0-9]\{3\}\)\.\([0-9]\{2\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\) -> \1.0\2.\3.\4 

^\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{1\}\)\.\([0-9]\{1,3\}\) -> \1.\2.00\3.\4 
^\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{2\}\)\.\([0-9]\{1,3\}\) -> \1.\2.0\3.\4 

^\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{1\}\) -> \1.\2.\3.00\4 
^\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{2\}\) -> \1.\2.\3.0\4 

不完全是你想要的完整的一行,但它至少把它减少到两行,而不是你现在的8行

以下格式与您在回答中使用的格式相同:

^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) -> 00\1.00\2.00\3.00\4

^0*([0-9]{3})\.0*([0-9]{3})\.0*([0-9]{3})\.0*([0-9]{3}) -> \1.\2.\3.\4
其工作方式是:

  • 它填充所有数字,以便每个部分中至少有3个数字
  • 它从每个节中提取出3个数字,并忽略任何前导的剩余“0”

  • 呃-在我的帖子或标签中,它在哪里说我可以运行jQuery?或者你的帖子是一个我不知道的文本小片段?我在一个有150万行的编辑器中,需要运行一个正则表达式。如果我能在编辑器中运行JS,我可以在JS中很好地完成这项工作。@mplungjan:Erm-在我的回答中,我在哪里说这段代码是jQuery?它说的是JavaScript,就是这样。有一些方法可以在编辑器之外操作文本文件,我认为这是一种有益的做法。感谢您的评论,并为erm感到抱歉-只是有点厌倦了目前为止我所看到的与我的问题无关的答案。我的编辑器里需要一个正则表达式。我每天都用JS。还可以编写JAVA或REXX程序来读取文件并填充ip地址。但这不是我现在想要或需要的。PS:你的“地图”不是一般的JS,而是JS1.6。在其他方面非常聪明和有用contexts@mplungjan:我的JavaScript只是为了说明一点。我本可以用另一种语言。您无法轻松地使用regex进行此操作,因为a)regex查找,而不是替换;b) 在大型日志文件的上下文中,很难找到插入零的正确位置,c)这将始终是一个多步骤操作,要正确执行此操作,需要8个搜索和替换步骤(分别为4个字节、“0”和“00”前缀)。我想说的是:使用编程语言来处理文本文件。正则表达式查找IP,使用与我的代码等价的东西替换。我明白你的意思,但正如我提到的,我可以替换捕获的字符串。如果捕获的输入是[0-9]{1},我的replace是00\1,如果[0-9]{2},它是0\1,如果[0-9]{3},它是\1,因为我可以一次做一个,我确信有人可以想出一个类似于这个单一replace([0-9]{1})\([0-9]{1,3})\([0-9]{1,3})的复合正则表达式([0-9]{1,3})->00\1.\2.\3.\4所以我想我现在可以在4个正则表达式中完成。您可以首先用
    00\1
    替换
    \b(\d)\b
    ,用
    0\1
    替换
    \b(\d\d)\b
    。不要全部替换-它会替换其他零散的号码谢谢Amarghosh。这或多或少是我通常做的事。单词边界上的\d\d是如何工作的?因为点?因为
    \d
    \w
    的一部分,而点或
    $
    不是。
    \b
    匹配
    \w
    \w
    以外的任何内容之间的任何位置,因此可以使用它来分隔连续数字。为什么要转义所有括号和大括号?这是textpad吗?“万一有人想出一个正则表达式”->没有人会,因为这是不可能的。是的,我很少使用这个词,如果有的话,那就不要夸张了。@Kobi:同意,反斜杠应该去掉。它们与显示的正则表达式无关。
    ^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) -> 00\1.00\2.00\3.00\4
    
    ^0*([0-9]{3})\.0*([0-9]{3})\.0*([0-9]{3})\.0*([0-9]{3}) -> \1.\2.\3.\4