使用与#34; es"匹配的Java正则表达式或" s"在字符串的末尾并返回没有该后缀的子字符串。看起来很简单,但我无法获得' e'与我尝试的表达相匹配。
这是我应该获得的输出:
"英寸" - > "英寸"
"米" - > "米"
"盎司" - > " ounc"
但是使用这个正则表达式:
Pattern.compile("(.+)(es|s)$", Pattern.CASE_INSENSITIVE);
我实际上得到了:
经过一番研究后,我发现了"。+"我的搜索部分过于贪婪,并将其更改为:"英寸" - > "英寸"
Pattern.compile("(.+?)(es|s)$", Pattern.CASE_INSENSITIVE);
解决了这个问题。不过,我的问题是为什么“'完全匹配?如果'贪婪''算法的本质是问题,不应该匹配整个字符串吗?
答案 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)
匹配。