好吧,这个有趣。我有 解决方案,但我不喜欢它。
我们的目标是能够找到一组以3个句点开头的行 - 不是单独的行,请注意,但是行中所有行匹配的集合。例如,这里有一些匹配(每个匹配用空行分隔):
...
...hello
...
...hello
...world
...
...wazzup?
...
我的解决方案如下:
^\.\.\..*(\n\.\.\..*)*$
它与所有这些相匹配,所以我现在正在使用它 - 但是,重复\.\.\..*
模式看起来有点傻。有更简单的方法吗?
请在提交之前test your regex,而不是提交“应该有效”的内容。例如,我首先尝试了以下内容:
(^\.\.\..*$)+
它只返回了单独的行,即使在我的脑海里看起来它会起作用 - 我想我只是不理解正则表达式内部。 (不,我不需要设置任何标志来获取^和$来匹配行边界,因为我在Ruby中实现它。)
所以我不能完全确定有一个好的答案,但我会非常感激 - 提前感谢!
答案 0 :(得分:1)
在大多数正则表达式实现中,您可以使用\.\.\.
缩短\.{3}
,以便您的解决方案变为\.{3}.*(\n\.{3}.*)*
。
答案 1 :(得分:1)
你已经拥有的东西已经很简单易懂了。请记住,更“聪明”的RegExps可能会更慢,而且无疑可读性更低。
假设行被\n
终止:
((^|\n)\.{3}[^\n]*)+
我不熟悉Ruby,因此根据它返回匹配的方式,您可能需要“不匹配”组:
((?:(?:^|\n)\.{3}[^\n]*)+)
答案 2 :(得分:1)
^([.]{3}.*$\n?)+
这里并不需要$
。
答案 3 :(得分:0)
您非常接近使用(^\.\.\..*$)+
的解决方案,但由于+
修饰符位于组外部,因此每次都会被覆盖,而您只剩下最后一行。尝试将其包装在外部组中:((^\.\.\..*$)+)
并查看第一个子匹配并忽略内部匹配。
结合其他建议:((^\.{3}.*$)+)