文字で区切られた文字列がある場合、次のように言いましょう。
a-b-c
区切り記号を保持したい場合は、次のように、後読みと先読みを使用して区切り記号自体を保持できます。
string.split("((?<=-)|(?=-))");
その結果、
a
-
b
-
c
ここで、次のように、区切り文字の 1 つがエスケープされている場合:
a-b\-c
そして、私はエスケープを尊重したいので、次のような正規表現を使用することにしました:
((?<=-(?!(?<=\\-))) | (?=-(?!(?<=\\-))))
だから
string.split("((?<=-(?!(?<=\\\\-)))|(?=-(?!(?<=\\\\-))))"):
今、これは機能し、結果は次のようになります。
a
-
b\-c
(後で で削除するバックスラッシュstring.replace("\\", "");
、正規表現に含める方法が見つかりませんでした)
私の問題は理解の問題です。
私が理解した方法では、正規表現は、言葉で言えば、
split ((if '-' is before (unless ('\-' is before))) or (if '-' is after (unless ('\-' is before))))
最後の部分が「\
前でない限り」であってはならないのはなぜですか? 「-」が後にある場合、それは「\」と「-」の間にあることを意味するため、「前」では\
なく「前」にする必要がありますが\\-
、正規表現を次のように反映するように変更すると機能しません。
((?<=-(?!(?<=\\-))) | (?=-(?!(?<=\\))))
結果: a
, -
, b\
,-c
これの理由は何ですか?推論のどこに誤りがありますか?