我正在尝试从文件中提取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
答案 0 :(得分:1)
答案 1 :(得分:1)
在您的模式中,您必须在匹配一个或多个文字字符\w+
之后使用量词。请注意,\w
本身与空格不匹配,因此您必须将它们添加到模式中以按字面意义进行匹配。
您可以省略空格前的\ b,因为\w
和空格之间存在单词边界,因此无需指定。
您可以使用更具体的匹配,对数字使用\d
:
^([A-Z0-9]+) (\d{1,3}(?:\.\d{1,3}){3}) (\d+) (\d+)$
说明
^
字符串的开头([A-Z0-9]+)
匹配字符类中列出的字符1+次和空格(\d{1,3}(?:\.\d{1,3}){3})
匹配类似ip的格式和空格(不验证ip)(\d+)
捕获1个以上的数字和空格(\d+)
捕获1个以上的数字和空格$
字符串结尾答案 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并扩大边界。
如果不需要此表达式,可以在regex101.com中对其进行修改或更改。
jex.im可视化正则表达式:
此代码段仅显示捕获组的工作方式:
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}`);
});
}