reg表达式从最后一个点截断一个字符串

时间:2016-04-26 12:34:55

标签: regex

我有以下字符串,我想从dot开始删除最后一部分。您能否提一些建议?我是reg表达的新手。 [ABC]。[DEF]的 [GHI]

谢谢, MC

1 个答案:

答案 0 :(得分:0)

您需要的regexp是:

(.*?)(?:\.[^.]*)?$

regexp逐件:

(          # start of the first capturing sub-pattern
  .*       # matches any character, any number of times (zero or more)
  ?        # make the previous quantifier (`*`) not greedy
)          # end of the first sub-pattern
(?:        # start of the second sub-pattern; it doesn't capture the matching string
  \.       # matches a dot (.)
  [^.]*    # matches anything but a dot (.), any number of times (zero or more)
)          # end of the second sub-pattern
?          # the previous sub-expression (the non-capturing sub-pattern) is optional
$          # matches the end of the string

工作原理:

第一部分(.*?)匹配并捕获所有内容,直到最后一个点。问号(?)使零或更多量词(*)不贪心。它默认是贪婪的,因为第二个子表达式必须是可选的(如下所示),它的贪婪使它与整个字符串匹配。

第二个子模式开头的?:说明符使其无法捕获。它匹配的子字符串不会被存储,也无法继续使用。

第二个子模式包含\.[^.]*并匹配一个点(.),后跟零个或多个字符,但它们都不能是点。如果输入字符串不包含点,则它不匹配,这使整个regexp不匹配。这就是为什么它被标记为可选,因为它带有问号(?)。

regexp一起使用的大多数工具都提供了一种方法,可以使用$n\n作为替换字符串中的占位符来获取和使用捕获的字符串。上面的n是捕获模式的编号,按其左括号(计算。由于我们只有一个捕获子模式,因此它匹配的子字符串可以是$1\1(或两者,或使用不同的语法)。

您可以在regex101.com上使用此regexp