2

文字で区切られた文字列がある場合、次のように言いましょう。

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

これの理由は何ですか?推論のどこに誤りがありますか?

4

2 に答える 2