正则表达式的负向前瞻(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);

解释

  • (?<![A-Za-z]):这是负向前瞻(negative lookbehind),用于确保 A-D 之前没有字母(不论大小写)。
    • [A-Za-z]:匹配任意字母。
    • (?<!...):表示前面不能是指定的内容(在这里是任意字母)。
  • ([A-D]):匹配字母 AD
  • \s*[.、)::]:匹配字母后的符号,如.) 等,以及可能的空白字符。
  • ([^<\n]+):匹配选项的内容,直到遇到换行符或 HTML 标签开始字符 <
  • /m:多行模式,确保 ^$ 能够匹配每一行的开头和结尾。

示例

假设有以下文本:

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 之前不能有其他字母,从而符合您增加的约束条件。

0 0 投票数
Article Rating
订阅评论
提醒
1 评论
最多投票
最新 最旧
内联反馈
查看所有评论
1
0
希望看到您的想法,请您发表评论x