Ruby正则表达式或解析器

Ruby正则表达式或解析器,ruby,regex,parsing,Ruby,Regex,Parsing,我想解析一个字符串,它看起来有点像github markdown,但我真的不想要完整的实现。字符串将是“代码”块和“文本”块的混合体。代码块将是三个倒勾,然后是一个可选的“语言”,然后是一些代码,最后是三个以上的倒勾。非代码几乎就是其他的一切。如果用户不能在“文本”块中输入三个反勾号,我不关心(但可能应该关心)。这里有一个例子 This is some text followed by a code block ```ruby def function "hello" end ``` So

我想解析一个字符串,它看起来有点像github markdown,但我真的不想要完整的实现。字符串将是“代码”块和“文本”块的混合体。代码块将是三个倒勾,然后是一个可选的“语言”,然后是一些代码,最后是三个以上的倒勾。非代码几乎就是其他的一切。如果用户不能在“文本”块中输入三个反勾号,我不关心(但可能应该关心)。这里有一个例子

This is some text followed by a code block ```ruby def function "hello" end ``` Some more text 似乎即使在简单的情况下,例如

md = /(a|b)*/.match("abaaabaa")

我不能得到所有的a和b。比如说md[3],它不存在。希望这更有意义,这就是为什么我认为RE在我的情况下不起作用,但我不介意被证明是错误的。

根据我对减价(github-,stackoverflow)的了解和你的问题(这对于本文的其余部分来说不是很精确),我将在这里做出一些假设

一,。 每个代码块都以一个单数行开始, 这只包括三个回勾,一个可选的回勾 语言名称和换行符

二,。 每个代码块仅以单数行结束 包含三个反勾号的

三,。 代码块不是空的

如果您可以接受这些假设,那么下面的代码应该可以工作 (假设文本位于
str
变量中):


如果不知道正则表达式使用的是什么,就很难提供帮助。如果你确定没有其他地方会出现三次倒勾(在我看来是有风险的,但可行的),我不确定问题是什么。最坏的情况下,你可以一行一行地做。你想要什么结果?你试过什么?你的问题有点模糊,但我建议逐行使用正则表达式来匹配这些行。例如,匹配代码块就是简单地匹配行中没有前面字符的三个反勾号,后跟一个有效的语言标记。然后,您将逐行扫描,直到您匹配一个只有三个回标记的行。您可以使用上述规则避免文本中的反勾号(反勾号之前或之后没有字符,只有有效的语言除外。这至少是我要开始的地方。正则表达式引擎(至少是传统的nfa引擎,如ruby中的nfa引擎)只会搜索直到匹配为止。此外,regex中没有多个捕获,即捕获(从组括号中)将只为您获取它捕获的最后一个匹配。同时,通过使用一个正则表达式匹配调用来获取所有这些应该非常缓慢…这看起来很合理,但我似乎无法使其工作(即正则表达式).你用来测试的字符串是什么?这是一个我一直在测试的字符串…我想如果我能看到你在测试什么,我可能可以让你的机制和正则表达式工作。P.s.无法正确格式化。希望你能看到我的意思。当我们完成循环时,我没有看到任何匹配。事实上,它似乎没有进入循环,因此我认为没有任何匹配项。我尝试直接从编辑块抓取,以确保代码正确。我正在运行ruby 1.9.3,您是否可能运行另一个版本,可能会产生不同?我知道了。粘贴时str变量的背面标记前面有空格。谢谢谢谢你的帮助,问题解决了。
md = /(a|b)*/.match("abaaabaa")
regex = %r{
  ^```[[:blank:]]*(?<lang>\w+)?[[:blank:]]*\n # matches start of codeblock, and captures optional :lang.
    (?<content>.+?) # matches codeblock content and captures in :content
  \n[[:blank:]]*```[[:blank:]]*\n # matches ending of codeblock.
}xm # free-space mode and . matches newline.
position = 0
matches = []
while(match = regex.match(str,position)) do
  position = match.end 0
  matches << [match[:lang], match[:content]]
end
str = %{
this is some random text.
```ruby
  def print
    puts "this is a code block with lang-argument"
  end
```

some other text follows here.
i want some ``` backticks here.

```
  def print
    puts "this is a code block without lang-argument"
  end
```
}