正则表达式:在字符串

时间:2015-09-28 15:19:03

标签: regex

使用与#34; es"匹配的Java正则表达式或" s"在字符串的末尾并返回没有该后缀的子字符串。看起来很简单,但我无法获得' e'与我尝试的表达相匹配。

这是我应该获得的输出:

  

"英寸" - > "英寸"

     

"米" - > "米"

     

"盎司" - > " ounc"

但是使用这个正则表达式:

Pattern.compile("(.+)(es|s)$", Pattern.CASE_INSENSITIVE);

我实际上得到了:

  

"英寸" - > "英寸"

经过一番研究后,我发现了"。+"我的搜索部分过于贪婪,并将其更改为:

Pattern.compile("(.+?)(es|s)$", Pattern.CASE_INSENSITIVE);

解决了这个问题。不过,我的问题是为什么“'完全匹配?如果'贪婪''算法的本质是问题,不应该匹配整个字符串吗?

2 个答案:

答案 0 :(得分:4)

当它与贪婪匹配时,它会尽可能地匹配,同时仍然符合表达式。因此,当它贪婪时,它将采取除s之外的所有内容,因为它无法接受s并且仍然符合表达式。当它与非贪婪匹配时,它会尽可能少地匹配,同时仍然满足表达式。因此,除了' es之外,它将采取所有内容,因为在满足表达式的同时,它可以尽可能少。

答案 1 :(得分:3)

简短回答

贪婪并不代表possessive。贪婪旨在尽可能多地消费/吃东西;但是从一个字符串不再匹配的那一刻起就会停止。

答案很长

在正则表达式中, Kleene星(*是贪婪的,这意味着它会尽可能多地尝试,但不会更多。考虑正则表达式:

(.+)(es|s)$

这里.+旨在尽可能多地吃东西。但是,当你以某种方式设法通过(es|s)时,你只能到达正则表达式的末尾,只有当它以至少一个s结束时才有可能。或者,如果我们对齐您的字符串inches

(.+)  (es|e)$
inche s

(添加空格)。换句话说.+

当你让它变得非贪婪时,.+?会尽快放弃进食。对于字符串inches,这是在inch

之后
(.+?) (es|e)$
inch  es

它不能早点放弃,因为h必须以某种方式与(es|e)匹配。