regexp以匹配简单的markdown

时间:2019-05-28 14:00:11

标签: java regex

我正在尝试找出正则表达式以匹配*this kind of strings*的所有出现。不幸的是,另外两个规则使这件事比我想象的要复杂:

  1. 带标签的字符串应以*开头,后跟非空格字符(因此* this one*不应该匹配
  2. 带标签的字符串应以非空格结尾,后跟*,后跟空格(因此,*this one **this o*ne不应该匹配

我从最简单的正则表达式\*\S([^\*]+)?\*开始,它是我的测试字符串:

*foo 1 * 2 bar* foo *b* azz *qu **ux*

匹配方括号中的位置:

[*foo 1 *] 2 bar* foo [*b*] azz [*qu *][*ux*]

这就是我想要实现的:

[*foo 1 * 2 bar*] foo [*b*] azz [*qu **ux*]

所以出现2个问题:

  • 如何在正则表达式中表达从2开始的规则:“搜索直到出现第一个非空白,然后是*,然后出现空白”?积极向前看?
  • 如何匹配规则2中的空格,但不将其包含在结果中,\*\S([^\*]+)?\*\s会这样做吗?

4 个答案:

答案 0 :(得分:2)

如果要从最右边 *开始匹配,则可以使用

\*(?=[^\s*]).*?(?<=[^\s*])\*(?!\S)

要从最左边的*开始匹配(如“”所示),请从第一次环视中删除*(或用\S替换其模式):

\*(?=\S).*?(?<=[^\s*])\*(?!\S)

请参见regex demo #1regex demo #2。在开头添加(?s)或使用Pattern.DOTALL进行编译以匹配多行文本。

详细信息

  • \*-一个*字符
  • (?=[^\s*])-下一个字符必须是非空格,而不是*
  • .*?-尽可能少包含0个字符
  • (?<=[^\s*])-前面的字符应该是非空格,而不是*
  • \*-一个*字符
  • (?!\S)-空格边界模式,下一个字符可以是空格,或者字符串的结尾可以在字符串的此位置。

在Java中:

String regex = "\\*(?=[^\\s*]).*?(?<=[^\\s*])\\*(?!\\S)";

答案 1 :(得分:1)

您可以使用this正则表达式:

\*(?!\s)(.*?)(?<!\s|\*)\*(?=\s|$)
  

如何在正则表达式中表达从2开始的规则:“搜索直到出现第一个非空白,然后是*,然后出现空白”?积极向前看?

只有当非星号前面有一个非空格字符时,您才可以使用负向后匹配该星号,而当其后接一个空格字符或字符串末尾时,则可以使用正向匹配该星号。

  

如何匹配规则2中的空格,但不将其包括在结果中,* \ S([^ *] +)?* \ s可以做什么?

如果您要检查pattern后是否有一个字符而不消耗它,可以使用先行方式,例如pattern(?=\s)不会消耗\s而不是pattern\s

答案 2 :(得分:0)

我使用完全匹配而不是分组,它与您的测试字符串完美匹配:

"(?<=\\s|^)\\*(?:\\S|\\S.*?\\S)\\*(?=\\s)"

答案 3 :(得分:0)

re = /(.+?)\/(\s.+)(\/.+)/m
str = 'hello/there/ hello/there/friend'
subst = '$1$2'

result = str.gsub(re, subst)

# Print the result of the substitution
puts result

* \ S :*后跟非空格字符

。*?:非贪婪地消费字符。

(?<!\ s)* :*后跟非空白字符。这是负面的表情    后面,它不会消耗非空格字符。

(?= \ s | $):正向。 *后接空格或    行尾。