1

文字列の一部を抽出する必要があります

文字列が

    "this is a string "xyz" "

ここから抽出したいのは文字列です

    xyz

しかし、問題は、同じ文字列の 2 つのバリエーションがあることです。

"this is a string "xyz" "
"this is a string - "

抽出したい

    xyz or -

抽出器を試してみた

    ".*((?:")[^"]*(?:")|-).*".r

これは抽出します-まあ、文字列も抽出しますが、引用符は除外しません。上記のように2つの文字列を指定したときに得られる結果は次のとおりです

    "xyz" instead of xyz
    - as expected

前もって感謝します。

4

3 に答える 3

1

look-aroundを使用します。つまり、次のように置き換えます。

(?:")[^"]*(?:")

(?<=")[^"]*(?=")

(?<=")肯定的な後読みで、前の文字が であることを確認します"が、一致には含めません。
(?=")次の文字が であることを確認する肯定的な先読みですが"、一致には含まれません。

より大きな string 内でこれを検索している場合は、置き換える.*.*?こともできます。.*?はできるだけ多くの文字に一致しますが、 where.*はできるだけ多くの文字に一致します。例として、与えられたabbbaabbba

a.*a  finds abbbaabbba as one match
a.*?a finds abbba and abbba separately

ただし、これらの変更により、新しい問題が発生します。通常の一致ではできなかったのに対し、ルックアラウンドは外側の波括弧と一致しようとする可能性があるからです。を に置き換える.*.+、この問題を防ぐことができます (これが一致に有効であると仮定すると-、ルックアラウンドを使用するため、引用符の一致は同じになるはずです)。

最終的な正規表現:

".+((?<=")[^"]*(?=")|-).+"

何のためだったのかわからない.r

テスト

于 2013-09-11T07:30:04.743 に答える
0

あなたが提供した例については、見回すようなものは必要ありません。

後方参照を使用して、ターゲットを「ラップ」しているものすべてが"- または何もないことを確認できます。

^this is a ("|)([^"\s]+)(\1)\s*$

次の文字列の周りにある場合はいつでも"、それらは一致の一部ではありません. 引用符がない場合、パターンのこの部分は無視されます。最後の後方参照は、このような文字列 "xy" と一致しないことを保証するだけです(これは、先行するものがある場合は常に"- 末尾のものが必要であることを示しています。)

http://regex101.com/r/cU1xM6

于 2013-09-11T07:54:48.313 に答える
0

あなたが与えたものがあなたのために働いていたなら、これはうまくいくはずです

(?<=").*((?:")[^"]*(?:")|-).*(?=")

これでは、ルックアヘッドとビハインドを使用しました。開始と終了の " に一致しますが、回答には含まれません。

于 2013-09-11T07:10:42.610 に答える