0

オープン ソース ゲームを C 言語に移植するのに役立つ、単純な VB6 から C へのトランスレータを実行しようとしています。ragex を使用して "With Npclist[NpcIndex]" から "NpcList[NpcIndex]" を取得し、置換する必要があるすべての場所で置換できるようにしたいと考えています。(「With」は、「End With」が見つかるまで、必要なときにいつでも Npclist[NpcIndex] を追加する VB6 のマクロとして使用されます)

Example:
 With Npclist[NpcIndex]
 .goTo(245) <-- it should be replaced with Npclist[NpcIndex].goTo(245)
 End With

正規表現を使用して仕事をすることは可能ですか? 関数を使用して、「With」と「End With」の間で別の正規表現置換を実行しようとしましたが、「With」が置換しているテキスト (Npclist[NpcIndex]) を知ることができません。前もって感謝します

4

3 に答える 3

0

これは、Python 2.7 で必要なことを行う可能性があります。Withandを取り除きたいと思いますよEnd Withね?C ではそれらは必要ありません。

>>> import re
>>> search_text = """
... With Np1clist[Npc1Index]
...  .comeFrom(543)
... End With
...
... With Npc2list[Npc2Index]
...  .goTo(245)
... End With"""
>>>
>>> def f(m):
...     return '{0}{1}({2})'.format(m.group(1), m.group(2), m.group(3))
...
>>> regex = r'With\s+([^\s]*)\s*(\.[^(]+)\(([^)]+)\)[^\n]*\nEnd With'
>>> print re.sub(regex, f, search_text)

Np1clist[Npc1Index].comeFrom(543)

Npc2list[Npc2Index].goTo(245)
于 2013-04-22T21:37:32.037 に答える
0

subメソッドに関数を渡すことができます。

# just to give the idea of the regex
regex = re.compile(r'''With (.+)
(the-regex-for-the-VB-expression)+?
End With''')

def repl(match):
    beginning = match.group(1)  # NpcList[NpcIndex] in your example
    return ''.join(beginning + line for line in match.group(2).splitlines())

re.sub(regex, repl, the_string)

replオブジェクトから一致に関するすべての情報を取得し、必要な文字match列を作成して返すことができます。一致した文字列は、返された文字列に置き換えられます。

上記の記述には細心の注意を払う必要があることに注意してくださいregex。特に(.+)、私が行ったように使用すると、除外された改行までのすべての行が一致しますが、これはあなたが望むものであるか、そうでないかもしれません(しかし、私はVBを知りませんし、あなたが望むものだけをキャッチするために代わりにどの正規表現がそこに行くことができるかわかりません.

についても同様(the-regex-forthe-VB-expression)+です。これらの行にどのようなコードがあるのか​​ わかりません。したがって、実装の詳細はあなたに任せます. すべての行を取得することは問題ないかもしれませんが、このような単純なものは信用できません (おそらく、式は複数の行にまたがる可能性がありますよね?)。

また、すべてを 1 つの大きな正規表現で行うと、一般にエラーが発生しやすく、処理が遅くなります。

私は、置換を行うために他の何かを見つけWithて使用するためだけに正規表現を強く検討します。End With

于 2013-04-22T18:59:00.013 に答える