与特定模式匹配但与另一个模式不匹配的正则表达式表达式



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

我可以通过使用这个正则表达式/_(.*?( 轻松做到这一点。_/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;

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

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

有关使用此正则表达式的示例,请参阅 regex101:

b_(.*?)_b

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

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

最新更新