匹配任何在[重复]之前没有特定单词的点

Posted

技术标签:

【中文标题】匹配任何在[重复]之前没有特定单词的点【英文标题】:Match any dot that doesn't have a certain word before [duplicate] 【发布时间】:2020-06-26 07:20:51 【问题描述】:

我有一个字符串,其模式类似于以下:

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.

我想用“.”分割这个字符串以获得类似:['TITLE','wordX. aaa.: AAAAAAA;AAAAA', 'BBBB: bbbb']

问题是字符串 'wordX. aaa.: AAAAAAA;AAAAA' 本身包含一个点,所以通过我之前所说的拆分字符串,真正的输出将是:['TITLE','wordX','aaa.: AAAAAAA;AAAAA', 'BBBB: bbbb']

因此,我想要一个正则表达式,它可以让我告诉拆分找到“每个不跟随 wordX 的点”。在互联网上寻找这个,我发现有些人建议对这些情况使用负前瞻,比如^((?!wordX).)*$。尽管如此,这显然对我不起作用(也许我没有以正确的方式使用它)。

由于这一切,我想知道如何构建一个正则表达式来匹配前面没有 wordX 并且后面跟着空格的每个点。

【问题讨论】:

您问题的第一部分和第二部分似乎不对应。你想只在一个点后面跟着一个短语,还是只在它后面没有某个短语时才找到它?如果是前者,一个简单的正向前瞻就足够了,例如\.(?=wordX). 如果你在匹配的点上分割字符串,你会不会得到["TITLE.wordX", " aaa", ": AAAAAAA;AAAAA", " BBBB: bbbb"] @CarySwoveland 问题可能不清楚,但我用“点+空格”分割 @oriberu 我想做第二件事,找到前面没有wordX的点 您的最后一条评论与您问题的最后一句直接矛盾,并且该句子没有说明点后跟空格的必要性。请编辑。 【参考方案1】:

我仍然不完全清楚您到底想要哪种方案,所以这里有几个选项,每种情况都匹配。

正向预测:

\.(?=wordX)

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.
     ^

负前瞻:

\.(?!wordX)

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.
           ^    ^               ^           ^

正向回顾:

(?<=wordX)\.

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.
           ^

消极的后视:

(?<!wordX)\.

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.
     ^          ^               ^           ^

无论如何,您都应该改写您的问题。干杯。

【讨论】:

感谢您的回答。我确实改写了我的问题。我想要的替代方案是您谈论的最后一个,但是,在regextester.com 尝试它时,它似乎也在 wordX 之后标记了点 哦,对不起,我在另一个网站上试过了,它确实有效(问题是我谈到的第一页是针对 javascript 的)。谢谢! 是的,JavaScript 和lookbehinds 的历史相当悠久。但它在 2018 年标准中,我们可以希望得到广泛实施。 :)【参考方案2】:

也许……

^(.*?)\.((.*?)(?<!wordX)\.(.*?))\. (.*)\.

给定:

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.

与组:

\1 \2 \5

演示:https://regex101.com/r/hPY8JX/2

糟糕,要更新 JS 吗?

^(.*?)\.(wordX\..*)\. (.*)\.

https://regex101.com/r/V49Fiw/1

【讨论】:

以上是关于匹配任何在[重复]之前没有特定单词的点的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配特定单词[重复]

在bash中匹配单词后的一行中打印特定字符串[重复]

试图制作一个简单的单词匹配程序[重复]

匹配除以单词开头之外的所有内容的模式[重复]

cat 文件到终端并为特定单词着色[重复]

在文本文件中查找特定单词并计算它