2012-04-09 5 views
2

Ich versuche wirklich, Regex zu lernen, also hier geht es.Regex - Holen Sie sich alle Wörter, die nicht mit einem "/" umhüllt sind

Ich möchte wirklich alle Wörter in einer Zeichenfolge, die kein "/" auf beiden Seiten haben. Zum Beispiel muß ich dies tun: „Hallo Große/Welt /“ Ich brauche die Ergebnisse haben: „Hallo“ „Great“

ist dies möglich, in regex, wenn ja, wie tun Ich tue es? Ich glaube, ich die Ergebnisse möchte in einem String-Array gespeichert werden :)

Danke

Antwort

3

einfach diesen regulären Ausdruck \b(?<!/)\w+(?!/)\b:

var str = "Hello Great /World/ /I/ am great too"; 
var words = Regex.Matches(str, @"\b(?<!/)\w+(?!/)\b") 
    .Cast<Match>() 
    .Select(m=>m.Value) 
    .ToArray(); 

Diese erhalten Sie:

Hello 
Great 
am 
great 
too 
+0

TECHNICALLY würde dies "/ World" oder "World /" sowie "/ World /" ... –

+0

@Code Jockey, der OP sagte * nicht ein '/' auf beiden Seiten * , so sollte dies die richtigen Ergebnisse produzieren – Alex

+0

Dies ist die beste Antwort @Alex Vielen Dank! – user1290653

0

ich einen regulären Ausdruck ersetzen verwenden würde alle/[a-zA-Z]/mit '' (nichts) zu ersetzen, dann erhalten alle Wörter

+0

Ich möchte nicht die Wörter, die in der "/" obwohl – user1290653

+0

enthalten sind, deshalb müssen Sie sie durch leere Zeichenfolge ersetzen (aka: entfernen diese) – kappa

+0

besser ersetzen [a-zA-Z] mit \ w +? –

1

Ich würde zuerst die Zeichenfolge in das Array aufteilen, dann passende Wörter herausfiltern. Diese Lösung könnte auch sauberer als eine große Regexp sein, weil Sie die Anforderungen für "Wort" und den Filter besser erkennen können.

Die große Regexp-Lösung wäre so etwas wie Wortgrenze - kein Schrägstrich - viele No-Whitespaces - keine Schrägstrich-Wortgrenze.

+0

fügen Sie jedes Wort zu einem Array hinzu und wenn das Wort kein "/" enthält, fügen Sie es hinzu? das ist genau das, was ich wirklich will – user1290653

2
var newstr = Regex.Replace("Hello Great /World/", @"/(\w+?)/", ""); 

Wenn Sie wirklich wollen, ein Array von Strings

var words = Regex.Matches(newstr, @"\w+") 
    .Cast<Match>() 
    .Select(m => m.Value) 
    .ToArray(); 
+0

Dies könnte zu zusätzlichen Leerzeichen in der letzten Zeichenfolge führen (Beispiel "Hallo Great/World// Ich bin auch toll"). Stellen Sie nur sicher, wenn Sie die Zeichenfolge in ein Array aufteilen, das leere Zeichenfolgen ignoriert. – pstrjds

0

diesem Beispiel Ausschnitt Verwendung:

Der/Zeichen/"_" (Unter/unter-strike) kann/used/in/Variable/Namen/in/many/programing// languages ​​/, während das/-Zeichen/"/" (Schrägstrich/Strich/Solidus) normalerweise nicht erlaubt ist.

... dieser Ausdruck passt eine beliebige Zeichenfolge aus Buchstaben, Zahlen, Unterstrichen oder Apostrophe (ziemlich typische Vorstellung von einem „Wort“ in englischer Sprache), die nicht über einen / Charakter sowohl vor und nach it - wrapped with a "/"

\b([\w']+)\b(?<=(?<!/)\1|\1(?!/)) 

... und ist die reinste Form, nur eine Zeichenklasse mit "Wort" Zeichen zu definieren.Es entspricht das Beispiel wie folgt:

Matched    Not Matched 
-------------   ------------- 
The     character 
_      used 
underscore   variable 
under     in 
strike    programming 
can     languages 
be     character 
in     stroke 
names 
many 
while 
the 
slash 
solidus 
is 
typically 
not 
allowed 

Wenn ohne /stroke/, nicht erwünscht ist, dann ein wenig zu Ende Einschränkung Zugabe wird es erlauben, je nachdem, wie Sie wollten den Beginn eines „nächsten“ Wort definieren:

\b([\w']+)\b(?<=(?<!/)\1|\1(?!/([^\w]))). 

ändert (?!/)-(?!/([^\w])), die /something/erlaubt, wenn es hat einen Buchstaben, eine Zahl oder unmittelbar nachdem sie unterstreichen. Dies würde stroke von der "Not Matched" auf die "Matched" -Liste, oben, bewegen.

Anmerkung: \w Streichhölzer Groß- oder Kleinbuchstaben, Zahlen und der Unterstrich

Wenn Sie Ihr Konzept für „Wort“ von oben zu ändern, einfach die Zeichen und Stenografie Zeichenklassen in der enthaltenen austauschen [\w'] Teil des Ausdrucks zu so etwas wie [a-zA-Z'] auszuschließen Ziffern oder [\w'-] zu Bindestriche enthalten, die under-strike als Einzelspiel erfassen würde, anstatt zwei separate Begegnungen:

\b([\w'-]+)\b(?<=(?<!/)\1|\1(?!/([^\w]))) 

WICHTIGE ALTERNATIVE !!!(glaube ich)

ich eines alternativen nur gedacht, um Passende alle Wörter, die nicht mit / Symbole eingewickelt: einfach verbrauchen alle diese Symbole und Wörter, die sind umgeben in sie (spaltend). Dies hat einige Vorteile: Kein Lookaround bedeutet, dass dies in mehreren Kontexten verwendet werden kann (JavaScript unterstützt kein Lookbehind und einige Varianten von Regex unterstützen überhaupt kein Lookaround), während die Effizienz gesteigert wird. Außerdem bedeutet die Verwendung eines Split-Ausdrucks ein direktes Ergebnis eines String-Arrays:

string input = "The /character/ "_" (underscore/under-strike) can be..."; //etc... 
string[] resultsArray = Regex.Split(input, @"([^\w'-]+?(/[\w]+/)?)+"); 

voila!

Verwandte Themen