ここで、誰もが考慮すべき興味深い問題があります。
文字で区切られた"/"
文字列を解析してトークン化しようとしていますが、括弧の間にない場合のみです。
例えば:
根/枝1/枝2/葉
次のようにトークン化する必要があります: "Root"
、"Branch1"
、"Branch2"
、"leaf"
ルート/ブランチ 1 (サブブランチ 1/サブブランチ 2)/リーフ
次のようにトークン化する必要があります: "Root"
、"Branch1(subbranch1,subbranch2)"
、"leaf"
ルート(branch1/branch2) テキスト(branch3/branch4) テキスト/ルート(branch1/branch2)/リーフ
"Root(branch1/branch2) text(branch3/branch4)"
、"Root(branch1/branch2)"
、としてトークン化する必要があります"leaf"
。
ONEを除くすべてのケースでうまく機能する次の式を思いつきました!
([^/()]*\((?<=\().*(?=\))\)[^/()]*)|([^/()]+)
これが機能しない唯一のケースは、次のテスト条件です。
ルート (ブランチ 1/ブランチ 2)/サブルート/サブルート (ブランチ 3/ブランチ 4)/リーフ
これは次のようにトークン化する必要"Root(branch1/branch2)"
があります: , "SubRoot"
, "SubRoot(branch3/branch4)"
,"Leaf"
代わりに得られる結果は、行全体に一致する 1 つのグループのみで構成されているため、まったくトークン化されていません。
「ルート(枝1/枝2)/サブルート/サブルート(枝3/枝4)/リーフ」
ここで起こっていることは、Regex が貪欲であるため、適切な区切り文字で停止することを知っているだけでなく、左端の開き括弧"("
を最後の閉じ括弧と一致させていることです。")"
この追加のケースを処理するために、既存の式に小さな正規表現を追加する方法を理解するのに役立つ正規表現の達人はいますか?
ルート(branch1/branch2) テスト(branch3/branch4)/SubRoot/SubRoot(branch5/branch6)/Leaf
次のようにグループにトークン化する必要があります。
「ルート(branch1/branch2)テスト(branch3/branch4)」 「サブルート」 「サブルート(branch5/branch6)」 "葉"