使用星号将正则表达式加粗

Regex expression to bold using asterisks

我有一个关于使用正则表达式在使用星号的字符串中加粗文本的问题。

关于此主题的其他问题适用于简单的场景,但我们遇到了一些问题。

我们的特定场景是将星号替换为 <bold></bold> 标签。 它还必须能够处理多个星号以及奇数个星号。

我们的示例输入文字如下;

string exampleText1 = "**** PLEASE NOTE *** Testing, *nuts*, **please note..., test";

string exampleText2 = "**Test text (10)";

我们当前的正则表达式如下;

Regex _boldRegex = new Regex(@"(\*)+([^*?$]+)+(\*)");

string value = _boldRegex.Replace(exampleText1, @"<bold></bold>");

示例 1 应显示 "<bold> PLEASE NOTE </bold> Testing, <bold>nuts</bold>, *please note..., test",其中星号组被视为单个星号,未完成的标签被忽略。

示例 2 使程序崩溃,因为它需要一个 'closing' 星号。它应该显示 "*Text text (10)"

任何人都可以通过建议一个新的正则表达式来提供帮助,同时记住处理星号组和奇数星号的能力吗?

提前致谢。

对于您的示例数据,您可以使用带有捕获组的可选部分来捕获重复字符 class,在 1 个或多个 *

之间没有换行符

在replace的回调中,可以检测组1是否存在,并据此进行替换。

\*+(?:([^*?$\n\r]+)\*+)?

模式匹配:

  • \*+ 匹配 1+ 次 *
  • (?:非捕获组
    • ( 捕获 组 1
      • [^*?$\n\r]+ 匹配字符 class
      • 以外的任何字符 1+ 次
    • ) 关闭组 1
    • \*+ 匹配 1+ 次 *
  • )? 关闭捕获组

看到一个regex demo.

例如

Regex _boldRegex  = new Regex(@"\*+(?:([^*?$\n\r]+)\*+)?");
string exampleText1 = @"**** PLEASE NOTE *** Testing, *nuts*, **please note..., test
**Test text (10)";
string value = _boldRegex.Replace(exampleText1, m => 
    m.Groups[1].Success ? String.Format("<bold>{0}</bold>", m.Groups[1].Value) : "*"
);
Console.WriteLine(value);

输出

<bold> PLEASE NOTE </bold> Testing, <bold>nuts</bold>, *please note..., test
*Test text (10)