Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用正则表达式提取电子邮件字段_Javascript_Node.js_Regex - Fatal编程技术网

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@']+)'