【问题标题】:Match strings with multiple regex patterns in javascript在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可以是任意正则表达式,我只举了两个例子。

【问题讨论】:

标签: javascript regex string-matching


【解决方案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 和电子邮件正则表达式。
    猜你喜欢
    • 2021-12-08
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2015-11-14
    • 2013-02-12
    相关资源
    最近更新 更多