在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.index
或 regexObj.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)
【讨论】:
谢谢,我通过更改顺序得到了它。在这里,我实际上发现了一个问题,由于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中匹配具有多个正则表达式模式的字符串的主要内容,如果未能解决你的问题,请参考以下文章