【问题标题】:How to implement a strictly matching markdown with regex in java?如何在java中使用正则表达式实现严格匹配的降价?
【发布时间】:2014-09-21 03:26:57
【问题描述】:

我正在尝试在 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>");

我尝试将 (.+?) 更改为 (.+?&amp;&amp;[^\*])(.*?[^\*].*?)(.+?[^\*].*?) 和许多其他,但它们对某些情况有效,而在其他情况下则失败!

不应匹配的示例:

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

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

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

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

我想做的事情是不是太复杂了?可以只用正则表达式吗?

  • 这是针对 Android 进行的,以防它与普通 java 不同。

【问题讨论】:

    标签: java android regex markdown


    【解决方案1】:

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

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

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

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

    如果您要添加斜体和下划线以及更多颜色,这将不会非常可扩展,但我认为如果这两个是您唯一的选择,它会工作得最好。

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

    【讨论】:

    • 对多行依然匹配,蓝色与blod混合时不起作用
    • 它也匹配 ***Hi***,因为 {2} 匹配至少 2 个但会匹配更多(据我所见,它在所有正则表达式引擎中都没有类似地实现)
    • 所有测试用例都有效,除了结合粗体和蓝色时,只有内部匹配
    • @FAD 查看更新的解决方案。抱歉回复晚了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多