擅长:python、mysql、java
<p>你得到了完全正确的结果。你知道吗</p>
<p>让我们以您的第一个regex<code>.*(.).*\1</code>和一些示例为例。你知道吗</p>
<p>例如,字符串是<code>abcabcbb</code>,这里是<code>b</code>。让我们看看为什么。你知道吗</p>
<p>您的正则表达式是<code>.*(.).*\1</code>,它以<code>.*</code>开头,这是贪婪的,这意味着它将消耗尽可能多的字符,同时提供匹配。所以<code>.*</code>捕获<code>abcabc</code>,因为这是<code>.*</code>可以做的最大可能的捕获,并且<code>(.)</code>将匹配<code>b</code>,<code>.*</code>将匹配空字符串,<code>\1</code>将再次匹配<code>b</code>,这就是匹配的结束。因此,<code>(.)</code>捕获了您正在获取的<code>b</code>。所以这不是一个错误的匹配。你知道吗</p>
<p>现在让我们以regex的非贪婪版本为例,它是<code>.*?(.).*?\1</code></p>
<p>让示例字符串为<code>abba</code>。这给了你<code>a</code>,让我们看看原因。你知道吗</p>
<p>您的正则表达式<code>.*?(.).*?\1</code>开始与<code>.*?</code>匹配,因此这次尝试尽可能少地匹配,因此不匹配任何内容,然后<code>(.)</code>匹配<code>a</code>,然后.*?匹配<code>bb</code>(记住它需要匹配最小值,但仍然生成匹配),最后<code>\1</code>匹配最后的<code>a</code>。这就是匹配结束的方式,在<code>(.)</code>中得到<code>a</code>,这是正确的。你知道吗</p>