首页 > 解决方案 > 正则表达式获取模式的最后一个匹配项

问题描述

这是一个类似于我要匹配的字符串(为了简单起见,除了几个特定的​​模式)。 Hello, tonight I'm in the town of Trenton in New Jersey and I will be staying in Hotel HomeStay [123] and I have no money.

我试图只匹配最后一个in Hotel HomeStay [123]

我现在对像前瞻和后视这样的正则表达式概念不太熟悉。这里的类似问题似乎无法解决我的问题。我已经尝试了一堆正则表达式(据我所知),这就是我想出的(?= (?:in|\d+))([\w \[]*\s*\d*\]*)(?!.*in)。数字和特殊字符可能是我实际尝试匹配的一部分。

lookahead 和lookbehind 模式不限于仅包含in. 它们也可以有更常用的词,例如andand is。我只是在寻找其中任何一个的最后一次出现,然后是主模式,这是非常独特的——编辑假设匹配必须包含HomeStayor LuxuryInn,为了示例。

但是,这与整个in the town of Trenton in New Jersey and I will be staying in Hotel HomeStay [123]. 我哪里错了?另外,有人可以解释为什么in尽管被置于非捕获组中但仍被捕获?

任何帮助是极大的赞赏。

标签: regexregex-lookaroundsregex-group

解决方案


在java中:

String s = "Hello, tonight I'm in the town of Trenton in New Jersey and I will be "
           + "staying in Hotel HomeStay [123] and I have no money.";
// Garbage: final String SUBP = "\\bin\\s+(\\S+)";
Pattern p = Pattern.compile("^.*\\sin\\s+(\\S+).*$", Pattern.DOTALL);
String last = p.matcher(s).replaceFirst("$1"); // If found

这将找到最后一个“... in ...”,因为.*(而不是 eager .*?)将寻找最长的序列。

上面的结果将是Hotel(非空格 afer in)但它可能是任何东西。


  • Dot-All 将产生.也匹配换行符的效果。
  • ^模式会从头到尾$
  • 任何字符.*(最长)后跟一个空格 char \s
  • 然后是“in”,然后是第 1 组中的一个单词(非空格\S+(...)
  • 然后任何字符直到结束.*。为了纯度,它应该是.*?最短的序列。
  • 结束$

推荐阅读