Pertanyaan regex tertanam {{matching


Saya harus mencocokkan seluruh pernyataan berikut:

{{CalendarCustom|year={{{year|{{#time:Y}}}}}|month=08|float=right}}

Pada dasarnya kapan pun ada { perlu ada yang sesuai } namun dengan banyak yang tertanam { } berada di dalam tag asli. Jadi misalnya {{match}} atau {{ma{{tch}}}} atau {{m{{a{{t}}c}}h}}.

Saya punya ini sekarang:

(\{\{.+?(:?\}\}[^\{]+?\}\}))

Ini tidak cukup berhasil.


7
2018-05-14 14:57


asal


Jawaban:


Mesin .NET regex memungkinkan pencocokan rekursif:

result = Regex.Match(subject,
    @"\{                   # opening {
        (?>                # now match...
           [^{}]+          # any characters except braces
        |                  # or
           \{  (?<DEPTH>)  # a {, increasing the depth counter
        |                  # or
           \}  (?<-DEPTH>) # a }, decreasing the depth counter
        )*                 # any number of times
        (?(DEPTH)(?!))     # until the depth counter is zero again
      \}                   # then match the closing }",
    RegexOptions.IgnorePatternWhitespace).Value;

15
2018-05-14 15:11



Saya sarankan menulis parser / tokenizer sederhana untuk ini.

Pada dasarnya, Anda melingkupi semua karakter dan mulai menghitung contoh { dan } - incrementing untuk { dan decrementing untuk }. Catat indeks masing-masing terlebih dahulu { dan indeks masing-masing terakhir } dan Anda akan memiliki indeks untuk ekspresi tertanam Anda.

Pada titik ini Anda bisa menggunakannya substring untuk mendapatkan ini dan menghapus / mengganti mereka dari string asli.

Lihat ini pertanyaan dan jawaban mengapa RegEx tidak cocok.


4
2018-05-14 15:08