与特定模式匹配但与其他模式不匹配的正则表达式表达式

时间:2019-07-10 09:34:14

标签: javascript regex

我需要在下划线之间的单词周围加上斜体标签,就像我们在此处对堆栈溢出格式选项所做的那样。

我可以使用此正则表达式/_(.*?)_/gi轻松地做到这一点。但事实是,我不想将这些标签放在电子邮件地址,URL等之间。因此,我需要一个与斜体模式匹配但与URL或电子邮件模式不匹配的正则表达式。

let urlExp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi;
let boldExp = /\*(.*?)\*/gi;
let italicExp = /\_(.*?)\_/gi;
let bulletedExp = /^\-\s(.*)/gm;
let emailExp = /([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})/gi;
let modifiedText = text
    .replace(urlExp, "<a href='$1' target='_blank'>$1</a>")
    .replace(emailExp, '<a href="mailto:$1">$1</a>')
    .replace(boldExp, "<strong>$1</strong>")
    .replace(italicExp, "<i>$1</i>")
    .replace(bulletedExp, "&#8226; $1");
return modifiedText;

这是我正在处理的代码。这里的问题是,粗体,斜体和项目符号也应用于网址和电子邮件,我需要跳过这两件事。

2 个答案:

答案 0 :(得分:0)

您可以使用单词边界(\b)来确定我们在一个单词的末尾或一个带下划线的单词,而不是在中间。

有关示例,请使用此正则表达式查看regex101

\b_(.*?)_\b

答案 1 :(得分:0)

只需检查是否有空格或字符串的开头或结尾:

let italicExp = /(^|\s)_(.*?)_(\s|$)/gi;
let modifiedText = text.replace(italicExp, "$1<i>$2</i>$3")