从文本中提取文本(单词)和IP地址

时间:2019-05-24 15:58:20

标签: regex

我正在尝试从文件中提取IP地址和文本,而不仅仅是IP

(\w\b)(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b)(\w\b)(\w\b)

输入数据:23E42B42 93.30.66.103 1535875201 0

预期:

Group1 23E42B42

Group2 93.30.66.103

Group3 1535875201

Group4 0

4 个答案:

答案 0 :(得分:1)

这会起作用

(\w+)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\w+)\s+(\w)

https://regex101.com/r/HGMeRL/1/

答案 1 :(得分:1)

在您的模式中,您必须在匹配一个或多个文字字符\w+之后使用量词。请注意,\w本身与空格不匹配,因此您必须将它们添加到模式中以按字面意义进行匹配。

您可以省略空格前的\ b,因为\w和空格之间存在单词边界,因此无需指定。

您可以使用更具体的匹配,对数字使用\d

^([A-Z0-9]+) (\d{1,3}(?:\.\d{1,3}){3}) (\d+) (\d+)$

Regex demo

说明

  • ^字符串的开头
  • ([A-Z0-9]+)匹配字符类中列出的字符1+次和空格
  • (\d{1,3}(?:\.\d{1,3}){3})匹配类似ip的格式和空格(不验证ip)
  • (\d+)捕获1个以上的数字和空格
  • (\d+)捕获1个以上的数字和空格
  • $字符串结尾

Regex demo

答案 2 :(得分:0)

您已经关闭。您需要将\w更改为\w+才能捕获一个或多个连续的单词字符。另外,请尝试匹配空格\s+而不是单词边界\b

(\w+)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\w+)\s+(\w+)

答案 3 :(得分:0)

在另一种方法中,我们也许可以从四个模式开始,并将它们之间的空间用作分隔符,也许类似于:

([A-Z0-9]+)\s+([0-9.]+)\s+([0-9]+)\s+([0-9]+)

我们所需的输出保存在捕获组$1$4中。我们可以为表达式添加更多边界,例如开始和结束字符:

^([A-Z0-9]+)\s+([0-9.]+)\s+([0-9]+)\s+([0-9]+)$

如果我们愿意,我们可以验证IP并扩大边界。

enter image description here

RegEx

如果不需要此表达式,可以在regex101.com中对其进行修改或更改。

RegEx电路

jex.im可视化正则表达式:

enter image description here

演示

此代码段仅显示捕获组的工作方式:

const regex = /^([A-Z0-9]+)\s+([0-9.]+)\s+([0-9]+)\s+([0-9]+)$/gm;
const str = `23E42B42 93.30.66.103 1535875201 0
23E42B42     93.30.66.103     1535875201   012`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}