擅长:python、mysql、java
<p>首先,我认为您可能需要用<code>\s+</code>替换空间,或者<code>\s</code>替换它,如果它确实是一个空间(在英文文本中经常会发现双空格)。</p>
<p>其次,要匹配一个大写字母,您必须使用<code>[A-Z]</code>,但是<code>A-Z</code>不起作用(但请记住,除了<code>A-Z</code>…,可能还有其他大写字母)。</p>
<p>另外,我想我知道为什么这不起作用。如果正则表达式引擎前面没有<code>Abs</code>或<code>S</code>,则它将尝试匹配<code>\. [A-Z]</code>。问题是,如果它由一个<code>S</code>前置,那么它是<em>而不是</em>由<code>Abs</code>前置,所以第一个模式匹配。如果它是由<code>Abs</code>前置的,那么它是由<code>S</code>前置的<em>而不是</em>前置的,所以第二个模式版本匹配。无论哪种方式,其中一种模式都将匹配,因为<code>Abs</code>和<code>S</code>是互斥的。</p>
<p>你问题的第一部分可能是</p>
<pre><code>(?<!Abs)(?<!S)(\. [A-Z])
</code></pre>
<p>或者</p>
<pre><code>(?<!Abs)(?<!S)(\.\s+[A-Z])
</code></pre>
<p>(根据我的建议)</p>
<p>那是因为你必须避免<code>|</code>,没有它,现在的表达式是<em>不受Abs</em>的影响,而<em>不受S</em>的影响。如果两者都是真的,模式匹配器将继续扫描字符串并找到匹配项。</p>
<p>要排除我想出的月份名称,请执行以下正则表达式:</p>
<pre><code>(?<!Abs)(?<!S)(\.\s+)(?!January|February|March)[A-Z]
</code></pre>
<p>同样的论点也适用于消极的前瞻模式。</p>