定義されたタグのペアの間のテキストのみで構成される文字列と、タグを含むテキストで構成される文字列を取得する必要があります。テキストは HTML<p>タグ内にあるため、<と><はandのように解釈さ>れます (私の知る限り、HTML Agility Pack のようなパーサーを使用することは不可能です)。
したがって、入力文字列は次のようになります。
Text outside of tags
<internal>    First occurance of text inside of tags    </internal>
More text outside of tags
<internal>    Second occurance     </internal>
現在、次のコードを使用していますが、最初の出現のみを取得し、2 番目の出現は取得しません。
Regex regex = new Regex(@"(<internal>(.*?)</internal>)", RegexOptions.Singleline);
MatchCollection matches = regex.Matches(inputString);
foreach (Match match in matches)
{
    string outerMatch = match.Groups[1].Value;
    string innerMatch = match.Groups[2].Value;
}