2016-07-02 7 views
1

は私がlookbehindで前方参照C#?

を取得したい文字列

pathwork 1 pathrelax 6 pathwork 2 pathrelax 7 pathwork 3

(?<=path(\w+)\s(\d)*.*?)path(\w+)(\s\d+) 

path$3$4$2 

を持っている正規表現のネット

で戻り読みと前方参照可能使用することです

パスワーク1パスリラックス6パスワーク21パスリラックス76パスワーク32

しかし、

pathwork 1 pathrelax 61 pathwork 26 pathrelax 72 pathwork 37

私は私がおよそ前方に読み、このコマンドの

を変更したいが、

(?<=path(\2)\s(\d)*.*?)path(\w+)(\s\d+) 

    path$3$4$2 

を動作しませhttp://www.regular-expressions.info/backref2.html#forward

+0

.NET構文はここの最後の例では少し違って見えます。http://www.regular-expressions.info/refext.html – Slai

答えて

0

あなたの第二の参照正規表現が動作すると、グループ番号が間違っています:

(?<=path(\3)\s(\d)*.*?)path(\w+)(\s\d+) 

それとも、その不要なグループを取り除くとバックナンバーをスケーリング取得できます。もちろん

(?<=path\2\s(\d)*.*?)path(\w+)(\s\d+) // r/w "path$2$3$1" 

は、あなたが本当に前方参照を使用する必要はありません。私はそれがこのようそれほど混乱だと言うつもりだった

(path\w+)(?<=\1 +(\d)*.*?\1) +(\d+) // r/w "$1$3$2" 

が、私はそれだけで違った混乱だと思う。ただ、正規表現の後の後読みを配置します。 regexesが後方に曲がることを強制することは決して美しくはありません。

+0

素晴らしい、ありがとう –