仅当两者之间存在某些文本时,正则表达式才匹配星号

Posted

技术标签:

【中文标题】仅当两者之间存在某些文本时,正则表达式才匹配星号【英文标题】:Regex to match asterisk only if some text is present in between 【发布时间】:2021-04-27 06:03:31 【问题描述】:

我有一个正则表达式模式,可以检测整个模式,即星号和中间的文本。

模式:(\*|__)(.*?)\1

我希望它只匹配星号,当单词出现在两者之间时。 示例:

*This is one* This is some other text *New word* Another text another* and there is some more text
应检测到This is one 的星号; 应检测到New word 的星号; 不应检测到最后一个星号,因为它没有任何结束星号。

我尝试了几种方法,但找不到一种方法,其中没有检测到中间词,只有星号。

编程语言: 打字稿(角度)

示例 2:

*Project Name:* This is some other text *New word* Another text another and there is some more text

【问题讨论】:

我认为你可以使用\*\b.*?\b\*(\*|__)\b(.*?)\b\1 @WiktorStribiżew 我希望只检测星号而不是中间的单词。我的正则表达式和你的完全一样 不,这不是一个好主意。你打算怎么处理他们? 见regex101.com/r/PdzmLX/1 - 使用上面的模式并替换为<ITALIC>$2<ITALIC> 或任何与$2(或\1)之间的东西。 你使用什么编程语言? 【参考方案1】:

你可以使用

/(\*|__)(?!\s)(.+?)(?<!\s)\1/g

请参阅regex demo。由于您实际上想用标签将* 括起来,因此您可以使用&lt;i&gt;$2&lt;/i&gt; 替换模式,其中$2 是对第2 组值的反向引用。

详情

(\*|__) - 第 1 组:*__ (?!\s) - 当前位置右侧不允许有空格 (.+?) - 第 2 组:任何 一个 或多个字符(换行符除外)尽可能少 (?&lt;!\s) - 当前位置左侧不允许有空格 \1 - 与第 1 组中的值相同(*__)。

查看 javascript 演示:

let text = '*This is one* This is some other text *New word* Another text another* and there is some more text **';
text = text.replace(/(\*|__)(?!\s)(.+?)(?<!\s)\1/g, '<i>$2</i>');
console.log(text);

【讨论】:

如果中间有任何特殊字符,如冒号、分号、撇号等,则不起作用。它也可以与它们一起使用吗? @MoannaTabala 除了换行符之间可以有任何其他内容,请参阅regex101.com/r/PdzmLX/3 如果您尝试问题中的示例 2,则正则表达式会中断。它不能按预期工作(当冒号或任何其他特殊字符介于两者之间时) @MoannaTabala 然后尝试空白边界,/(\*|__)(?!\s)(.*?)(?&lt;!\s)\1/g 这样检测**,不正确。

以上是关于仅当两者之间存在某些文本时,正则表达式才匹配星号的主要内容,如果未能解决你的问题,请参考以下文章

仅当内容具有某些单词时,正则表达式才删除括号和内部内容

仅当没有给定前缀具有任意数量的空格时才匹配单词

Python正则表达式:仅当模式重复n次时才匹配

仅当连接明确时才更新行

仅当字符串的一部分前面没有某些字符时,如何匹配它?

如何用正则表达式匹配连字符?