12

文字列をトラバースして40個の値を引き出す正規表現があります。以下のクエリのように見えますが、はるかに大きく、より複雑です。

est(.*)/test>test>(.*)<test><test>(.*)test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test>

私の質問は、数値が9を超えたときに、replaceコマンドでこれらの式をどのように使用するかです。使用するたびに\10、の値を返し、最後に\1aを追加するように見えます0

どんな助けでも大歓迎です:)

また、私はUEStudioを使用していますが、別のプログラムの方がうまくいく場合は、大したことはありません:)

4

5 に答える 5

4

編集者が使用する単純な正規表現エンジンのほとんどは、10を超える一致するグループを処理する機能を備えていません。UltraEditではできないようです。Notepad ++を試したところ、10グループの正規表現と一致しません。

あなたの最善の策は、まともな正規表現パーサーを使用して、迅速な言語で高速に何かを書くことだと思います。しかし、それは尋ねられた質問に答えません

Pythonの内容は次のとおりです。

import re

pattern = re.compile('(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)')
with open('input.txt', 'r') as f:
    for line in f:
        m = pattern.match(line)
        print m.groups()

Pythonでは\20:などの後方参照が許可されていることに注意してください。グループ2への後方参照の後にリテラル0を付けるに\g<2>0は、明確な、を使用する必要があります。

編集:ほとんどのフレーバーの正規表現、および正規表現エンジンを含むエディターは、次のように置換構文に従う必要があります。

abcdefghijklmnop
search: (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(?<name>.)(.)
note:    1  2  3  4  5  6  7  8  9  10 11 12 13
value:   a  b  c  d  e  f  g  h  i  j  k  l  m
replace result:
    \11      k1      i.e.: match 1, then the character "1"
    ${12}    l       most should support this
    ${name}  l       few support named references, but use them where you can.

名前付き参照は通常、非常に特定の種類の正規表現ライブラリでのみ可能です。ツールをテストして確実に確認してください。

于 2010-07-21T22:20:26.170 に答える
1

9 個を超えるサブグループを処理できない場合は、最初に 9 個のグループに一致させてから、ループしてそれらの一致に正規表現を適用してみませんか?

つまり、最初に一致(<test.*/test>)+し、次にサブグループごとに一致し<test(.*)/test>ます。

于 2010-07-21T23:54:52.470 に答える