正则表达式匹配点号之前的任何内容

5
我希望能够创建一个正则表达式,匹配任何被四个或更多点所跟随的内容:
asdf....... 

将匹配到asdf

我尝试使用:

.+?(?=\.{4,})

但是它只会忽略最后四个点,因此它匹配 asdf...。要如何实现?

5
尝试使用正则表达式 (.*?)\.{4,},并获取第一组的值。 - Wiktor Stribiżew
最小的修改是使用一个排除字面点而不是 . 的类:[^.]+(?=\.{4,})。尽管如此,Wiktor 的解决方案可能更有效。 - Aaron
1
如果无法使用捕获组,则可以使用:.*[^.](?=\.{4}) - anubhava
anubhava的解决方案和我的区别在于:如果你搜索的数据可能包含点(例如,使用123.456....匹配将仅返回我的解决方案中的456,而使用anubhava的解决方案将正确返回123.456),那么我的解决方案将失败,但如果搜索数据中没有点,则更有效率(根据regex101,我的解决方案在12个步骤中匹配你的样本数据,而anubhava的解决方案需要29个步骤,因为.*在回溯到[^.]匹配之前匹配到字符串的末尾)。 - Aaron
2个回答

2
.+?(?=\. {4,})正则表达式匹配asdfasdf.......中,因为它找到了值后面有4个或更多点,但是由于\.{4,}在非消耗模式内,所以.......仍然需要检查,那个子字符串的第一个.再次匹配,因为.+?匹配任何1个或多个字符(除换行符之外),但尽可能少。同样的事情也发生在第二个和第三个.上,因为它们都跟着4个或更多逗号。

您可以将点匹配部分变为消耗模式并捕获.+?(然后需要的值将在组1中):

(.+?)\.{4,}

请查看正则表达式演示 在这里,(.*?)是一个捕获组,匹配0个或多个字符(使用*代替+可匹配1个或多个),除了换行符以外的任何字符,\.{4,}将匹配并消耗4个或更多.字符(不允许在点内部检查匹配)。

如果这是在更大的文档中,例如:“嗨……你好……在那里abc……”,它将愉快地匹配其后面更大的一系列点 - KyleFairns

0
^(?!\.+)(.+?)\.{4,}$

捕获4个或更多点之前的任何内容,但也确保字符串不是全部

如果您正在搜索较大的文档:

(?!\.).+?(?<!\.)(?=\.{4,})

点击这里查看第一个示例

点击这里查看第二个示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接