仅使用起始标记和起始标记捕获文本会在一行中多次出现

时间:2015-09-28 18:00:20

标签: ruby regex

鉴于此文:

fluid * capable of flowing freely like water
* having or showing a smooth and easy style

liquid * shining and clear * clear, smooth, and pleasant in sound

我需要能够分别捕捉这些部分

  1. capable of flowing freely like water
  2. having or showing a smooth and easy style
  3. shining and clear
  4. clear, smooth, and pleasant in sound
  5. 使用此正则表达式:/\*(.*)/

    导致:

    1. capable of flowing freely like water
    2. having or showing a smooth and easy style
    3. shining and clear * clear, smooth, and pleasant in sound
    4. 是否可以在不引入结束标记的情况下完成此任务?

2 个答案:

答案 0 :(得分:0)

你可以通过写

来做到这一点
str.gsub(/\n\n.*?\s/,'').gsub("\n",'').split('*').drop(1)

它给出了这个

[" capable of flowing freely like water", " having or showing a smooth and easy style", " shining and clear ", " clear, smooth, and pleasant in sound"]

从每行的开头和结尾删除空格

str.gsub(/\n\n.*?\s/,'').gsub("\n",'').split('*').drop(1).map(&:lstrip)

答案 1 :(得分:0)

您的正则表达式 - \*(.*) - 匹配文字星号,然后匹配除换行符之外的0个或更多字符(尽可能多)。在大多数情况下,.*匹配行的其余部分,有或没有其他星号。

所有您需要的是scan \*([^*\n]*)正则表达式(其中否定字符类[^*\n]将匹配限制为下一个星号或换行符):

s.scan(/\*([^*\n]*)/)

请参阅IDEONE demo

请注意,如果在正则表达式中定义了捕获组,scan将仅返回捕获的文本。我们将其定义为([^*\n]),它匹配任何字符,但换行符和星号。 \*匹配文字星号,*量词告诉正则表达式引擎匹配前面的子模式0次或更多次。