2017-11-01 6 views
1

によって%%交換するとき、私は解析が<!-- -->

、私はそれが red parsing and replacing double % with <> doesn't work

のわずかな変化だったので簡単だろうと思った

test: "bla bla <!--bla bla--> bla bla bla bla <!--bla--> bla" 

test: "bla bla %bla bla% bla bla bla bla %bla% bla" 

を変換したい永遠にループするが、私のコードは永遠にループしますが、私は "終了する"ルールを持っています:

答えて

2

あなたは空の文字列に「%」を交換しようとしているから問題が来ます。 "%"はそこにとどまり、常にヒットを得る。あなたのルールは何のメリットもないのに、parseを使用せずにこれらの変更

rules: [ 
    any [ 
     to "%" mark: (
      toggle: negate toggle 
      either toggle = 1 [ 
       change/part mark {<!--} 1 
      ][ 
       change/part mark {-->} 1 
      ] 
     ) 
    ] 
    to end 
] 
3

私はto(またはthru)を使用しません。彼らは少し危険です。あなたがしたい場合は、toggleを取り除くことができ、また

toggle: false 
parse test [ 
    some [ 
     change #"%" (either toggle: not toggle ["<!--"]["-->"]) 
    | skip 
    ] 
] 

:私のようなものを使用することになり

parse test [ 
    some [ 
     change #"%" (first reverse ["-->" "<!--"]) 
    | skip 
    ] 
] 
+0

私は今のところ、より高度になるだろうときに使用ウィル:)本当にスマートなソリューション私の目的は基本を学ぶことです。 – user310291

+1

Ok :)しかし、少なくとも整数型の代わりに論理型のトグルを採用するべきだと思います。元のコードのように、 'トグル:どちらのトグルでもトグルしないでください 'という2つの行に分けることができます。 'logic!'はより適切です、 'toggle = 1'はとにかく' logic! 'になります。なぜなら、それを直接使用しない理由です。 – rebolek

1

と連携し、もうひとつの方法:

until [none? attempt [insert remove find test "%" first reverse ["-->" "<!--"]]] 
関連する問題