繁体   English   中英

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

[英]How to implement a strictly matching markdown with regex in java?

我试图在Java中制作一个简单的markdown解析器,我只需要一个将字符串加粗,另一个就可以将颜色更改为蓝色,并且还可以将两个markdown组合在一起。 因此,对于粗体,单词必须位于双星之间*,但是,如果五个星或更多星之间没有任何区别,我不希望它匹配(许多站点仍将其匹配,并将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

也不应在多行之间匹配。

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

  • 如果Android与正常的Java不同,则可以执行此操作。

我认为这两个应该为您做:

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

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

  • 蓝色和粗体: (^|\\s)(\\*{3}b|\\*b\\*{2})([\\w\\d ]+)\\*{4}($|\\s)

如果您要添加斜体和下划线以及更多颜色,则扩展性不是很好,但是我认为,如果这两个是您唯一的选择,则效果最好。

让我知道是否存在不匹配的情况,或者在不应该匹配的情况下是否匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM