2016-11-24 4 views
1

Ich bin auf der Suche nach einem Weg für regexp nur ignorieren übereinstimmen, wenn das Wort nicht umgeben ist {c} {text/c} Block und einen Weg gefunden,Regexp, die Wörter innerhalb eines Blocks

/(?![^{]*.*})(.+?)(?![^{]*.*})/g 

aber es ignoriert alles um zwei herumliegende {} ({} text {} wird ignoriert) was nicht das ist was ich will. Die Regexp ist für meine Chat-App, die in Knoten js geschrieben wird. Der Punkt ist, dass ich andere regexp will nichts in Seiten {c} analysieren {/ c} Block, auch die anderen {c} {/ c} Block, so etwas wie

{c} 
    {c} text {/c} this is how you show codes 
{/c} 

wird

<pre> 
    {c} text {/c} this is how you show codes 
</pre> 

EDIT: Das ist, was ich jetzt benutze.

var from = [ 
/(?![^{]*.*})`(.+?)`(?![^{]*.*})/g, /*bold `text`*/ 
/(?![^{]*.*})''(.+?)''(?![^{]*.*})/g, /*italics ''text''*/ 
/(?![^{]*.*})~~(.+?)~~(?![^{]*.*})/g, /*strikethrough ~text~*/ 
/(?![^{]*.*})@@(.+?)@@(?![^{]*.*})/g, /*code @@[email protected]@*/ 
/{q}\s*(.+?)\s*{\/q}/g, /*quote {q}text{/q}*/ 
/{c}\s*(.+?)\s*{\/c}/g, /*preview {c}text{/c}*/ 
]; 

var to = [ 
    "<strong>$1</strong>", 
    "<em>$1</em>", 
    "<span style='text-decoration:line-through'>$1</span>", 
    "<code>$1</code>", 
    "<blockquote>$1</blockquote><br />", 
    "<pre class=\"code\">$1</pre><br />", 
]; 
+0

Regexp ist nicht gut geeignet für diese Art von verschachteltem Konstrukt Handhabung. –

+0

Können Sie mir andere mögliche Lösungen sagen? Regexp ist das einzige, was ich kenne, wenn ich diese Art von Arbeit mache. – Yanaro

+0

können wir mit reinem Javascript auch tun –

Antwort

1

Der folgende reguläre Ausdruck wird den gleichen Job machen. Es wird die gesamte zwischen {c} und {/c} eingewickelte Schnur zusammenpassen.

/{c}(.*){\/c}/g 

Mit reinem Javascript:

var str = "{c} {c} text {/c} this codes {/c}"; 
 

 
var word1 = "{c}", word2 = "{/c}"; // words to be removed 
 
var newWord1 = "<PRE>", newWord2 = "</PRE>"; // words need to be replaced 
 

 
var fIndex = str.indexOf(word1); // getting first occurance of word1 
 
str = str.replace(str.substring(0, word1.length), newWord1); // replacing it with newWord1 
 

 
var lIndex = str.lastIndexOf(word2); // getting index of last occurance of word2 
 
str = str.substring(0, lIndex) + newWord2 + str.substring(lIndex+word2.length, str.length); // and replacing it with newWord2 
 

 
console.log(str);

+0

Dies funktioniert, wenn {c} Block in einem anderen {c} Block ist, funktioniert aber nicht, wenn ein anderer Block wie {c} {q} {/ q} {/ c} – Yanaro

+0

Sorry, ich hab dich nicht bekommen. Können Sie die Beispieleingabe und -ausgabe für den obigen Fall kommentieren? –

+0

Siehe meine bearbeitete Frage. Ich benutze {q} um blockquote zu analysieren, {c} um die Vorschau zu analysieren. Wenn ich tippe, {c} {q} {/ q} {/ c}, bekomme ich

, aber ich will es
{q} {/q}
Yanaro

Verwandte Themen