最佳正则表达式:匹配以。开头的行集

时间:2009-07-03 21:22:14

标签: ruby regex

好吧,这个有趣。我有 解决方案,但我不喜欢它。

我们的目标是能够找到一组以3个句点开头的行 - 不是单独的行,请注意,但是行中所有行匹配的集合。例如,这里有一些匹配(每个匹配用空行分隔):

...

...hello

...
...hello
...world
...
...wazzup?
...

我的解决方案如下:

^\.\.\..*(\n\.\.\..*)*$

它与所有这些相匹配,所以我现在正在使用它 - 但是,重复\.\.\..*模式看起来有点傻。有更简单的方法吗?

请在提交之前test your regex,而不是提交“应该有效”的内容。例如,我首先尝试了以下内容:

(^\.\.\..*$)+

它只返回了单独的行,即使在我的脑海里看起来它会起作用 - 我想我只是不理解正则表达式内部。 (不,我不需要设置任何标志来获取^和$来匹配行边界,因为我在Ruby中实现它。)

所以我不能完全确定有一个好的答案,但我会非常感激 - 提前感谢!

4 个答案:

答案 0 :(得分:1)

在大多数正则表达式实现中,您可以使用\.\.\.缩短\.{3},以便您的解决方案变为\.{3}.*(\n\.{3}.*)*

答案 1 :(得分:1)

你已经拥有的东西已经很简单易懂了。请记住,更“聪明”的RegExps可能会更慢,而且无疑可读性更低。

假设行被\n终止:

((^|\n)\.{3}[^\n]*)+

我不熟悉Ruby,因此根据它返回匹配的方式,您可能需要“不匹配”组:

((?:(?:^|\n)\.{3}[^\n]*)+)

答案 2 :(得分:1)

^([.]{3}.*$\n?)+

这里并不需要$

答案 3 :(得分:0)

您非常接近使用(^\.\.\..*$)+的解决方案,但由于+修饰符位于组外部,因此每次都会被覆盖,而您只剩下最后一行。尝试将其包装在外部组中:((^\.\.\..*$)+)并查看第一个子匹配并忽略内部匹配。

结合其他建议:((^\.{3}.*$)+)