使用ruby regex

时间:2016-12-27 17:15:13

标签: ruby regex

我将这个降价字符串作为字符串:

# section 1\n\n
any type of valid markdown text. /notations here\n 
Sample text for testing:
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789 _+-.,!@$%^&*();\/|<>"'
12345 -98.7 3.141 .6180 9,000 +42
555.123.4567    +1-(800)-555-2468
foo@demo.net    bar.ba@test.co.uk
www.demo.com    http://foo.co.uk/
http://regexr.com/foo.html?q=bar
https://mediatemple.net
- list 1
- list 2
[www.asdf.com](some description)

## sec 1.1\n blah\n
# header 2\n\n
## 2.1\n\n
### 2.2\n
# some_section\n
## 3.1\n\n

我想逐节拆分字符串,例如输出应该是3个字符串条目的列表。第一个条目应为'#section 1 \ n \ n ## 1.1 \ n blah \ n'。

我正在使用的正则表达式是/ [^#]#[\ s \ S] +?(?=#)/。如何匹配最后没有'#'的字符串?我的正则表达式匹配整个字符串而不是我需要的输出。

http://regexr.com/3ev83处的示例。感谢。

2 个答案:

答案 0 :(得分:2)

试试这个,

string.split(/(?=^# )/)

如果您想要从####

的任何标题进行拆分
string.split(/(?=^#+ )/)

这是如何运作的?

  • ^匹配行的开头
  • (?=...)是一场前瞻性比赛
  • 无需匹配行结尾

答案 1 :(得分:1)

您可以使用slice_before代替大型正则表达式:

markup = "# section 1\n\n
## 1.1\n
blah\n
# section 2\n\n
## 2.1\n\n
### 2.2\n
# section 3\n
## 3.1\n\n "

p markup.each_line.slice_before(/# section \d+/).map(&:join)
#=> ["# section 2\n\n\n## 1.1\n\nblah\n\n", "# section 2\n\n\n## 2.1\n\n\n### 2.2\n\n", "# section 3\n\n## 3.1\n\n "]

如果要概括任何标题的方法,可以使用:

p markup.each_line.slice_before(/^# /).map(&:join)

如果要迭代每个部分中的每一行,可以删除join:

markup.each_line.slice_before(/^# /).each do |section|
  section.each do |line|
    # do something with line
  end
end