在javascript中匹配具有多个正则表达式模式的字符串

Posted

技术标签:

【中文标题】在javascript中匹配具有多个正则表达式模式的字符串【英文标题】:Match strings with multiple regex patterns in javascript 【发布时间】:2022-01-18 09:14:57 【问题描述】:

我试图匹配字符串上的多个正则表达式模式以查找开始和结束索引。

let str = "I am abinas patra and my email is abinas@gmail.com"
let patterns = [
  "[a-z]",
  "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4$"
];
let regexObj = new RegExp(patterns.join("|"), "gmi");
let match, indicesArr=[];
while ((match = regexObj.exec(str))) 
  let obj =  start: match.index, end: regexObj.lastIndex 
  indicesArr.push(obj);
  if(!match.index || !regexObj.lastIndex) break;


我在indicesArr 中只得到 1 个对象

[
  
    "start":0,
    "end": 1
  
]

Sandbox link

我希望所有a-z 字符都应该匹配,email 也应该匹配。我尝试了多种方法,找不到它。 这里patterns数组中,pattern可以是任意正则表达式,我只举了两个例子。

【问题讨论】:

***.com/questions/42407785/… 【参考方案1】:

我尝试使用 for 循环来获取关于任何顺序的所有匹配项。

let str = "I am abinas patra and my email is abinas@gmail.com"
let patterns = [
  "[a-z]",
  "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4"
];
let match, indicesArr = [];
for(let i=0;i<patterns.length; i++)
  let regexObj = new RegExp(patterns[i], "gmi");
  while ((match = regexObj.exec(str)) !== null) 
    let obj = 
      start: match.index,
      end: regexObj.lastIndex
    
    indicesArr.push(obj);
  

console.log(indicesArr)

Sandbox

【讨论】:

【参考方案2】:

在循环 if(!match.index || !regexObj.lastIndex) break; 中使用这一行将在 if 子句中的任一语句为真时停止循环。

如果 match.indexregexObj.lastIndex 为零,则为真,循环将停止,例如,如果第一个字符匹配,因为索引将为 0。

p>

您还可以切换模式的顺序,将最具体的模式放在首位。因为邮件的第一个字符也会被[a-z]匹配,否则邮件将不匹配。

请注意省略电子邮件中的锚点^$,否则电子邮件仅在它是唯一字符串时才会匹配。

let str = "I am abinas patra and my email is abinas@gmail.com"
let patterns = [
  "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4",
  "[a-z]"
];
let regexObj = new RegExp(patterns.join("|"), "gmi");
let match, indicesArr = [];
while ((match = regexObj.exec(str))) 
  let obj = 
    start: match.index,
    end: regexObj.lastIndex
  
  indicesArr.push(obj);

console.log(indicesArr)

【讨论】:

谢谢,我通过更改顺序得到了它。在这里,我实际上发现了一个问题,由于patterns.join("|") 或条件,它与第一个或下一个匹配.. @abinaspatra 是的,这就是像这样使用| 替代的本质,模式是[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]2,4|[a-z],因此您可以匹配电子邮件地址或单个字符a-z【参考方案3】:

改用这个:

function extractEmails(text) 
  return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi);


let str = "I am abinas patra and my email is abinas@gmail.com";
let emailAddress = extractEmails( str );
let remainingString = str.replace( emailAddress, '' );

function extractEmails(text) 
  return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi);


let str = "I am abinas patra and my email is abinas@gmail.com";
let emailAddress = extractEmails( str );
let remainingString = str.replace( emailAddress, '' );

console.log( "Original string: " + str );
console.log( "Email address: " + emailAddress );
console.log( "Remaining string: " + remainingString );

【讨论】:

这里在patterns 数组中,模式可以是任何正则表达式,我只举了两个例子。这是 a-z 和电子邮件正则表达式。

以上是关于在javascript中匹配具有多个正则表达式模式的字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配具有两个或多个特殊字符的强密码

JavaScript正则表达式模式匹配——基本字符匹配

Javascript 与正则表达式

JavaScript正则表达

正则表达式和JavaScript

JavaScript正则表达式