You can use an empty block which will prevent the vertical rule in the second row (the command \Block{1-2}{}
below).
\documentclass{article}
\usepackage{nicematrix}
\begin{document}
\begin{NiceTabular}{p{2.5cm}p{2.5cm}p{2.5cm}|p{2.5cm}}
&& \Block{1-2}{Subject}&\\
&& \Block{1-2}{}\textbf{Semantic} & \textbf{Substantive} \\
\cline{3-4}
\Block{2-1}{Justification} & \textbf{Semantic} & Surplusage & Common law \\
\cline{3-4}
& \textbf{Substantive} & Whole code & Lenity
\end{NiceTabular}
\end{document}
As usual with nicematrix
, you need several compilations.
You can also add the vertical rule as a border of an empty block (the command \Block[borders=right]{2-1}{}
below).
\documentclass{article}
\usepackage{nicematrix}
\begin{document}
\begin{NiceTabular}{p{2.5cm}p{2.5cm}p{2.5cm}p{2.5cm}}
&& \Block{1-2}{Subject}&\\
&& \textbf{Semantic} & \textbf{Substantive} \\
\cline{3-4}
\Block{2-1}{Justification} & \textbf{Semantic} &
\Block[borders=right]{2-1}{}
Surplusage & Common law \\
\cline{3-4}
& \textbf{Substantive} & Whole code & Lenity
\end{NiceTabular}
\end{document}
The output is not exactly the same because, now, the rule is drawn after the construction of the array and no space is reserved for the vertical rule between the columns (3 & 4). Of course, that's only a difference of 0.4 pt.
You can also draw with Tikz in the \CodeAfter
: \CodeAfter \tikz \draw (3-|4) -- (last-|4);
(of course this technic requires a minimal knowledge of Tikz).
\documentclass{article}
\usepackage{nicematrix,tikz}
\begin{document}
\begin{NiceTabular}{p{2.5cm}p{2.5cm}p{2.5cm}p{2.5cm}}
&& \Block{1-2}{Subject}&\\
&& \textbf{Semantic} & \textbf{Substantive} \\
\cline{3-4}
\Block{2-1}{Justification} & \textbf{Semantic} &
Surplusage & Common law \\
\cline{3-4}
& \textbf{Substantive} & Whole code & Lenity
\CodeAfter \tikz \draw (3-|4) -- (last-|4) ;
\end{NiceTabular}
\end{document}
The output is the same.