如何在java中用正则表达式实现严格匹配的markdown?

时间:2014-09-16 17:48:55

标签: java android regex markdown

我正在尝试在java中创建一个简单的markdown解析器,我只需要一个将字符串加粗,另一个将颜色更改为蓝色,并且还可以将两个markdown组合在一起。 因此,对于大胆的单词需要在双星*之间放置,但是,如果只有5星或更多,中间没有任何东西,我不希望它匹配(许多网站仍然匹配,并将5星改为单个粗体一)所以如果用户使用星星绘制分隔线或其他东西它们应该按原样显示,但如果有星星或其他符号如数学公式4 * 5(换句话说,介于两者之间的不仅仅是明星)

到目前为止,这是我的代码,它可以匹配粗体,蓝色和两者,但仍匹配5星以上。

str = str.toString().replaceAll("\*\*(.+?)\*\*", "<big>$1</big>");
str = str.toString().replaceAll("\*b(.+?)\*\*", "<font color='blue'>$1</font>");

我尝试将(.+?)更改为(.+?&&[^\*])(.*?[^\*].*?)(.+?[^\*].*?)以及其他许多内容,但这些内容适用于某些内容,而其他情况则失败!

不应匹配的示例:

****
*****    (5 and more stars)
*Hi*
***Hi***
**New\nLine**

应该与两种情况或两种情况相匹配的示例(粗体和蓝色):

**Hi** : BOLD
*bHi** : Blue
***bHi**** : BOLD and Blue
*b**Hi**** : BOLD and Blue

它也不应该在多行之间匹配。

我想做的事情太复杂了吗?可以用正则表达式来完成吗?

  • 如果它与普通的java不同,这是针对Android的。

1 个答案:

答案 0 :(得分:0)

我认为这两个应该为你做到:

  • 大胆:(^|\s)\*{2}([\w\d ]+)\*{2}($|\s)
  • 蓝色:(^|\s)\*b([\w\d ]+)\*{2}($|\s)

我最终决定测试蓝色和粗体组合最简单的方法是添加一个新的正则表达式:

  • 蓝&amp;大胆:(^|\s)(\*{3}b|\*b\*{2})([\w\d ]+)\*{4}($|\s)

如果您要添加斜体和下划线以及更多颜色,这将无法扩展,但我认为如果这两个是您唯一的选择,它将会发挥最佳效果。

让我知道是否存在这些不匹配的情况,或者当它们不应该匹配时它们是否匹配。