正则表达式的负向前瞻(negative lookbehind)机制

要确保正则表达式中的 A-D 字母前不能有其他字母,我们可以通过负向前瞻(negative lookbehind)来实现这一要求。负向前瞻会检查字母 A-D 之前的内容,确保它前面没有其他字母(即不是字母字符)。

修改后的正则表达式

question = preg_replace('/(?<![A-Za-z])([A-D])\s*[.、)::]\s*([^<\n]+)/m',     '<span class="option-clickable" data-option="1">1.2<span class="correct-mark">✅</span></span>',
    question);</code></pre> <!-- /wp:code -->  <!-- wp:heading {"level":3} --> <h3 class="wp-block-heading">解释</h3> <!-- /wp:heading -->  <!-- wp:list --> <ul class="wp-block-list"><!-- wp:list-item --> <li><code>(?<![A-Za-z])</code>:这是负向前瞻(negative lookbehind),用于确保 <code>A-D</code> 之前<strong>没有字母</strong>(不论大小写)。<!-- wp:list --> <ul class="wp-block-list"><!-- wp:list-item --> <li><code>[A-Za-z]</code>:匹配任意字母。</li> <!-- /wp:list-item -->  <!-- wp:list-item --> <li><code>(?<!...)</code>:表示前面<strong>不能</strong>是指定的内容(在这里是任意字母)。</li> <!-- /wp:list-item --></ul> <!-- /wp:list --></li> <!-- /wp:list-item -->  <!-- wp:list-item --> <li><code>([A-D])</code>:匹配字母 <code>A</code> 到 <code>D</code>。</li> <!-- /wp:list-item -->  <!-- wp:list-item --> <li><code>\s*[.、)::]</code>:匹配字母后的符号,如<code>.</code>、<code>、</code>、<code>)</code>、<code>:</code> 等,以及可能的空白字符。</li> <!-- /wp:list-item -->  <!-- wp:list-item --> <li><code>([^<\n]+)</code>:匹配选项的内容,直到遇到换行符或 HTML 标签开始字符 <code><</code>。</li> <!-- /wp:list-item -->  <!-- wp:list-item --> <li><code>/m</code>:多行模式,确保 <code>^</code> 和 <code> 能够匹配每一行的开头和结尾。




示例

假设有以下文本:

A. Asynchronous JavaScript And XHR
B. ��Asynchronous jQuery And XML
C. Asynchronous JavaScript And XML
D. ��Advanced JavaScript And XML
AA. Invalid option

应用修改后的正则表达式后,AA. Invalid option 不会被匹配,因为 A 前面有另一个 A,而 AD 的其他选项会被正常匹配。

匹配结果:

<span class="option-clickable" data-option="A">A. Asynchronous JavaScript And XHR<span class="correct-mark">✅</span></span>
<span class="option-clickable" data-option="B">B. Asynchronous jQuery And XML<span class="correct-mark">✅</span></span>
<span class="option-clickable" data-option="C">C. Asynchronous JavaScript And XML<span class="correct-mark">✅</span></span>
<span class="option-clickable" data-option="D">D. Advanced JavaScript And XML<span class="correct-mark">✅</span></span>

总结

通过使用负向前瞻 (?<![A-Za-z]),我们确保了 A-D 之前不能有其他字母,从而符合您增加的约束条件。

评论

《“正则表达式的负向前瞻(negative lookbehind)机制”》 有 1 条评论

  1. C3P00

    这种写法非常重要!

发表回复

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 知差(chai)网
快取状态: No
内存使用量: 9.9164 MB
资料库查询次数: 28
页面产生时间: 0.830 (秒)