修改正则表达式以匹配开始和结束字符

时间:2020-08-09 04:58:22

标签: regex

我是regex的新手,正在玩正则表达式以匹配markdown语法,尤其是斜体文本,例如:

this is markdown with some *italic text*

写了一些幼稚的实现后,我found this regex似乎做得很好(处理边缘情况)并匹配了整个字符串:

(?<!\*)\*([^ ][^*\n]*?)\*(?!\*)

但是,我不想匹配整个字符串-我只想匹配*开头和结尾的字符(以便可以对那些字符进行一些特殊的格式设置)。我该怎么做呢?

棘手的事情是,当字符串的其余部分与斜体的正确格式匹配时(即满足上述正则表达式的要求),我只想匹配*个字符。因此,像(\*|\*)这样的简单正则表达式就不会削减它。

2 个答案:

答案 0 :(得分:2)

除了在开头和结尾对星号使用捕获组之外,您可以将星号添加到第一个取反的字符类中,以防止与双**匹配。

注意,正如@ toto所指出的,您实际上并不需要星号(\*)周围的捕获组。您还可以匹配它们,并在中间的内容的单个捕获组之前和之后添加替换字符。

这也意味着它应该至少匹配一个字符,而不是一个星号。

您不必使第一个字符类成为非贪婪的*?,因为它不能越过随后的*边界。

(?<!\*)(\*)([^*\s][^*\r\n]*)(\*)(?!\*)

Regex demo

如果结尾星号前也没有空格,则可以重复匹配一个空格,然后匹配除星号(?: [^*\s]+)*以外的任何非空白字符char

否定字符类中的\r\n是为了防止换行符边界也与\s匹配。如果不是这种情况,则可以用空格或制表符和空格代替。

(?<!\*)(\*)([^*\s]+(?: [^*\s]+)*)(\*)(?!\*)

Regex demo

答案 1 :(得分:1)

只需将第一个\*和第二个(?<!\*)(\*)([^ ][^*\n]*?)(\*)(?!\*) 更改为捕获组即可,您可以随意更改:

{{1}}

Demo

相关问题