【问题标题】: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)之间的东西。
  • 你使用什么编程语言?

标签: javascript angular regex typescript


【解决方案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
  • 这样检测**,不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多