12

我想从一些文本中抓取数据并将其转储到一个数组中。考虑以下文本作为示例数据:

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

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

/((?=:).+)/

不幸的是,这个正则表达式也抓住了冒号和冒号后面的空格。我如何只获取数据?

另外,我不确定我是否做对了。但看起来好像外部括号会导致匹配返回一个数组。这是parens的功能吗?

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

4

4 回答 4

18

您可以将其更改为:

/: (.+)/

并获取第 1 组的内容。不过,后视也可以工作,并且可以满足您的要求:

/(?<=: ).+/
于 2012-12-17T23:58:23.027 回答
4

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

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

这里的不同之处在于,您使用后视来创建/获取组。

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

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

这将围绕您现有的正则表达式进行分组,它将在一个组中捕获它。

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

于 2012-12-18T01:45:17.010 回答
1

我知道您要使用正则表达式,但我刚刚看到了正则表达式解决方案,发现对于不熟悉正则表达式的人来说很难阅读。

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

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

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

于 2014-08-28T12:46:16.743 回答
0

在 Ruby 中,与 PCRE 和 Boost 一样,您可以使用\K 匹配重置运算符

\K将匹配的文本保持在整体正则表达式匹配之外。h\Kd仅匹配 中的第二dadhd

所以,你可以使用

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

请参阅Rubular 演示 #1Rubular 演示 #2

细节

  • :- 一个冒号
  • [[:blank:]]*- 0 个或多个水平空白字符
  • \K- 匹配重置运算符从整体匹配内存缓冲区中丢弃到目前为止匹配的文本
  • .+- 匹配并使用除换行符以外的任何 1 个或多个字符(使用/m修饰符匹配任何字符,包括换行符)。
于 2020-07-10T16:08:06.633 回答