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

Match strings with multiple regex patterns in javascript

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

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数组中,模式可以是任何正则表达式,我只是举了两个例子。

改用这个:

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 );

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

如果 match.indexregexObj.lastIndex 为零,则为真,循环将停止,例如,如果第一个字符作为索引存在匹配项,则会发生这种情况将为 0。

您还可以切换模式的顺序,将最具体的放在最前面。因为电子邮件的第一个字符也会被 [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)

我尝试使用 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