正则表达式 - 匹配某些字符后的文字

时间:2012-12-17 23:56:20

标签: ruby regex

我想从某些文本中抓取数据并将其转储到数组中。请将以下文本视为示例数据:

| Example Data
| Title: This is a sample title
| Content: This is sample content
| Date: 12/21/2012

我目前正在使用以下正则表达式来抓取“冒号”字符后指定的数据:

/((?=:).+)/

不幸的是,这个正则表达式还会在结肠后抓住结肠和空间。我如何只获取数据?

另外,我不确定我这样做是否正确..但似乎外部的parens导致匹配返回一个数组。这是parens的功能吗?

编辑:我正在使用Rubular来测试我的正则表达式

4 个答案:

答案 0 :(得分:16)

您可以将其更改为:

/: (.+)/

并抓住第1组的内容。但是,后视也是有效的,而且正是你所要求的:

/(?<=: ).+/

答案 1 :(得分:3)

除了@minitech的回答,您还可以进行第三种变体:

/(?<=: ?)(.+)/

不同之处在于,您使用后视创建/抓取组。

如果你仍然喜欢前瞻而不是后视概念。 。

/(?=: ?(.+))/

这将在您现有的正则表达式周围放置一个分组,它将在一个组中捕获它。

是的,代码中的外括号将匹配。与后一个示例相比,我给出了整个预测被“分组”的地方而不是不必要地使用/( ... )/而没有/(?= ... )/,因为大多数正则表达式引擎中的第一个结果返回整个匹配的字符串

答案 2 :(得分:0)

我知道你要求正则表达式,但我刚刚看到了正则表达式解决方案,发现那些不熟悉正则表达式的人很难阅读。

我也在使用Ruby,我决定这样做:

line_as_string.split(": ")[-1]

这可以满足您的需求,恕我直言,它更具可读性。 对于很长的字符串,它可能效率低下。但不是为了这个目的。

答案 3 :(得分:0)

在Ruby中,就像在PCRE和Boost中一样,您可以使用\K match reset operator

\K使匹配的文本保持在正则表达式的总体匹配范围之外。 h\Kd仅匹配d中的第二个adhd

因此,您可以使用

/:[[:blank:]]*\K.+/     # To only match horizontal whitespaces with `[[:blank:]]`
/:\s*\K.+/              # To match any whitespace with `\s`

看到Rubular demo #1Rubular demo #2

详细信息

  • :-冒号
  • [[:blank:]]*-0个或多个水平空白字符
  • \K-匹配重置运算符将匹配的文本从整体匹配存储缓冲区中丢弃至今
  • .+-匹配并使用除换行符以外的任何1个或更多字符(使用/m修饰符匹配包括换行符的任何字符)。