次のようなパターンはどうでしょうか。
.*?\((CPT|ICD)-[A-Z0-9.]+\)
これは、任意の 0 個以上の任意の文字に非貪欲に一致し、その後に a(
が続き、その後にCPT
またはICD
が続き、その後にハイフンが続き、その後に 1 つ以上の大文字のラテン文字、10 進数またはピリオドが続き、その後に)
.
[A-Z0-9.]+
私の理解では、現在のすべてのICD-9 コード、ICD-10 コード、およびCPT コードはそのパターンに準拠しているため、選択したことに注意してください。
C# コードは次のようになります。
var result = Regex.Matches(input, @".*?\((CPT|ICD)-[A-Z0-9.]+\)")
.Cast<Match>()
.Select(m => m.Value);
周囲の空白を避けたい場合は、単に結果の文字列 ( ) を削除するか、次のように aを前にm => m.Value.Trim()
置いて、一致するプレフィックスが空白以外の文字で始まるようにします。\S
var result = Regex.Matches(input, @"\S.*?\((CPT|ICD)-[A-Z0-9.]+\)")
.Cast<Match>()
.Select(m => m.Value);
または、次のような入力を処理する必要がある場合は、否定先読みを使用します(ICD-100)(ICD-200)
。
var result = Regex.Matches(input, @"(?!\s).*?\((CPT|ICD)-[A-Z0-9.]+\)")
.Cast<Match>()
.Select(m => m.Value);
ここで実際のデモを見ることができます。