Javascript 使用正则表达式提取电子邮件字段
我正试图用这个代码提取“电子邮件”Javascript 使用正则表达式提取电子邮件字段,javascript,node.js,regex,Javascript,Node.js,Regex,我正试图用这个代码提取“电子邮件” const regex3 = /Email',\r\n value: '([^']*)',/gm; var content3 = fs.readFileSync('message.txt') let m3; while ((m3 = regex3.exec(content)) !== null) { // This is necessary to avoid infinite loops with zero-width matches
const regex3 = /Email',\r\n value: '([^']*)',/gm;
var content3 = fs.readFileSync('message.txt')
let m3;
while ((m3 = regex3.exec(content)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m3.index === regex3.lastIndex) {
regex3.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m3.forEach((match, groupIndex) => {
fs.appendFileSync('messagematch.txt', m3[1] + '\n');
});
}
从这个文件
},
MessageEmbedField {
embed: [Circular *2],
name: 'Email',
value: 'user@gmail.com',
inline: true
},
MessageE
正则表达式代码在记事本上有效,但在我的脚本上无效。。我缺少什么?也许,在
s
(单行)模式下尝试您的表达:
试验
const regex=/Email'\s*,\s*值:\s*'([^'\r\n]*)”/gs;
常量str=`},
消息嵌入字段{
嵌入:[循环*2],
名称:'电子邮件',
值:'user@gmail.com',
内联:对
},
信息`;
让m;
while((m=regex.exec(str))!==null){
//这是避免具有零宽度匹配的无限循环所必需的
if(m.index==regex.lastIndex){
regex.lastIndex++;
}
//可以通过'm`-变量访问结果。
m、 forEach((匹配,组索引)=>{
log(`Found match,group${groupIndex}:${match}`);
});
}
您可以尝试以下方法:
var测试=`
},
消息嵌入字段{
嵌入:[循环*2],
名称:'电子邮件',
值:'user@gmail.com',
内联:对
},
消息
`;
var myregexp=/name:'Email',\s+值:'(\b[A-Z0-9.\uz0%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b),/img;
var match=myregexp.exec(测试);
console.log(匹配[1])代码>我建议用几种方法更改正则表达式,使其更加健壮和容错
首先,在电子邮件中包含初始单引号,以避免意外捕获其他字段,其中可能有人将“email”一词作为值
其次,使用\r?\n
捕获Windows和Unix样式的行结尾。我怀疑这可能是你问题的一大部分,但不能确定
第三,使用\s+
,而不是专门包含一些空格。这将有助于避免小的格式更改引起的问题
最终的正则表达式如下所示:
const regex = /'Email',\r?\n\s+value: '([^']*)',/gm
我错过了什么
- 您可以使用
\r\n
来匹配Windows样式的换行符,但也可以选择\r
来匹配Unix样式。请参见关于换行符
- 您可以在代码中指定
var content3
,但您可以像regex3.exec(content)
- 此外,模式和示例数据问题中的空格数也不同
您可以使用\s+
代替硬编码空格数,但\s
也可以匹配换行符
如果要在没有换行符的情况下匹配空格,可以使用[^\S\r\n]
来匹配除非空格字符和换行符之外的任何字符
'Email',\r?\n[^\S\r\n]+value:[^\S\r\n]+'([^\s@']+@[^\s@']+)'
电子邮件,
逐字匹配
\r?\n
匹配换行符
[^\S\r\n]+
匹配1+除换行符以外的空白字符
值:
按字面匹配
[^\S\r\n]+'
匹配1+个空格字符,但换行符和'
(
Capturegroup 1
([^\s@']+@[^\s@']+'
匹配类似电子邮件的格式
)”
关闭组1并匹配”
const regex3=/'Email',\r?\n[^\S\r\n]+值:[^\S\r\n]+'([^\S@']+@[^\S@']+)/g;
var content3=`},
消息嵌入字段{
嵌入:[循环*2],
名称:'电子邮件',
值:'user@gmail.com',
内联:对
},
信息`;
让m3;
while((m3=regex3.exec(content3))!==null){
//这是避免具有零宽度匹配的无限循环所必需的
if(m3.index==regex3.lastIndex){
regex3.lastIndex++;
}
控制台日志(m3[1]);
}
FYI-调试任何正则表达式的一个有用工具是regex101.com。这是该工具中的代码:。这是一个固定版本:我想知道是否有一种方法可以使用库将输入文件解析为JS对象,类似于JSON.parse,除了您正在阅读的任何格式之外。或者只需在\s之后将行完全分开即可
也会匹配。是的,但如果您特别想确保这两个部分之间有换行符,您最好将其保留在中。请查看以下网站:;
'Email',\r?\n[^\S\r\n]+value:[^\S\r\n]+'([^\s@']+@[^\s@']+)'