regex - 正则表达式获取模式的最后一个匹配项
问题描述
这是一个类似于我要匹配的字符串(为了简单起见,除了几个特定的模式)。
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
. 它们也可以有更常用的词,例如and
and is
。我只是在寻找其中任何一个的最后一次出现,然后是主模式,这是非常独特的——编辑假设匹配必须包含HomeStay
or LuxuryInn
,为了示例。
但是,这与整个in the town of Trenton in New Jersey and I will be staying in Hotel HomeStay [123]
. 我哪里错了?另外,有人可以解释为什么in
尽管被置于非捕获组中但仍被捕获?
任何帮助是极大的赞赏。
解决方案
在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+
)(...)
- 然后任何字符直到结束
.*
。为了纯度,它应该是.*?
最短的序列。 - 结束
$
。
推荐阅读
- java - ListFragment 更改维度
- react-native - 使用 forwardRef 在 React Native/Router Flux 上执行 this.function
- wordpress - 通过父 ID 获取分类的子类别
- java - Maven 不想在同一个 testng 套件中的第一个测试之后运行其他测试
- rxjs - 用其他 observable 的结果初始化 observable
- selenium - 遍历不同包装器中的元素失败
- html - 旧设备和平台上的字体不一致,设计元素有时会中断
- python - 基于更新数据的预测
- r - 在 r 中绘图 - 删除和重命名标题和标签
- python - ssd_mobilenet 损失不能下降