2016-04-28 12 views
0

Ich habe einen Test-String:Spiel ausgeglichen Vorkommen von verschachtelten Tags

s = "A test [[you|n|note|content of the note with a [[link|n|link|http://link]] inside]] paragraph. wef [[you|n|note|content of the note with a [[link|n|link|http://link]] inside]] test".

Ich muss die Vorkommen der [[...]] Teile der Zeichenfolge übereinstimmen. Es kann bis zu der zweiten Ebene von verschachtelten [[ ]] Tags in der Zeichenfolge (wie in der Testzeichenfolge gezeigt) geben.

ich mit /\[\[.*?\]\]/ gestartet, aber das nur Spiele wie folgt vor:.? [[you|n|note|content of the note with a [[link|n|link|http://link]] (es das letzte Vorkommen des ]] fehlt

Wie gehe ich über den Rest jeder [[ .. ]] Block Matching ist dies möglich mit regex ?

+0

Sie wollen nur die äußeren? Haben Sie eine einzelne '[' '' '' '' 'innen? – sawa

+1

Was ist das gewünschte Ergebnis für Ihr Beispiel? –

Antwort

1

Wenn Sie isoliert [ oder ] nicht einzelne haben, dann ist es ziemlich einfach. die folgende keine Beschränkung der verschachtelten Ebene annimmt.

s.scan(/(?<match>\[\[(?:[^\[\]]|\g<match>)*\]\])/).flatten 

kehrt:

[ 
    "[[you|n|note|content of the note with a [[link|n|link|http://link]] inside]]", 
    "[[you|n|note|content of the note with a [[link|n|link|http://link]] inside]]" 
] 
+0

Danke @sawa! Das funktioniert gut. Jetzt muss ich diese Regex verwenden und sie mit einer anderen kombinieren. Ich habe eine Anforderung, wo ich Textänderungen anpassen muss. Standardmäßig passe ich mit '/ \ s /' zusammen, so dass ich jede Änderung als ganzes Wort behandle. Ich muss das ändern, damit ich "alle Änderungen der Wörter anpasse,' '[[..]]' blocks als ganze Wörter behandle ". Eine Beispielausgabe von 'string.split (regex)' ist: '[" A "," test "," [[you | n | note | Inhalt der Notiz mit einem [[link | n | link | http:// link]] innen]] "," Absatz. "]'. Ist das möglich? – Sean

1

Hier ist eine nicht-regex Lösung. Ich habe angenommen, dass die linken (rechten) Klammern immer paarweise erscheinen.

level = 0 
s.each_char.each_cons(2).with_index.with_object([]) do |(pair, i), a| 
    case pair.join 
    when "[[" 
    level += 1 
    a << i if level==1 
    when "]]" 
    a << i+1 if level==1 
    level -= 1 
    end 
end.each_slice(2).map { |b,e| s[b..e] } 
    #=> ["[[you|n|note|content of the note with a [[link|n|link|http://link]] inside]]", 
    # "[[you|n|note|content of the note with a [[link|n|link|http://link]] inside]]"] 
Verwandte Themen