我想从某些文本中抓取数据并将其转储到数组中。请将以下文本视为示例数据:
| Example Data
| Title: This is a sample title
| Content: This is sample content
| Date: 12/21/2012
我目前正在使用以下正则表达式来抓取“冒号”字符后指定的数据:
/((?=:).+)/
不幸的是,这个正则表达式还会在结肠后抓住结肠和空间。我如何只获取数据?
另外,我不确定我这样做是否正确..但似乎外部的parens导致匹配返回一个数组。这是parens的功能吗?
编辑:我正在使用Rubular来测试我的正则表达式
答案 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 #1和Rubular demo #2和
详细信息
:
-冒号[[:blank:]]*
-0个或多个水平空白字符\K
-匹配重置运算符将匹配的文本从整体匹配存储缓冲区中丢弃至今.+
-匹配并使用除换行符以外的任何1个或更多字符(使用/m
修饰符匹配包括换行符的任何字符)。