2009-07-17 4 views
1

Sorry, das ist wahrscheinlich wirklich einfach. Aber wenn Sie in jeder Zeile ein Trennzeichen haben und den ganzen Text vor dem Trennzeichen in jeder Zeile suchen wollen, was würde dann mit regulärem Ausdruck geschehen? Ich weiß nicht, ob das Trennzeichen zählt, aber das Trennzeichen, das ich habe, ist das% -Zeichen.Wie finden Sie den gesamten Text bis zum ersten Zeichen x in einer Zeile?

+0

Haben Sie weitere Kriterien für den Text oder wollen Sie einfach alles vor dem% packen? –

+2

In welcher Sprache ist Ihr Projekt? Regex _might_ nicht der beste Weg, dies zu tun. – beggs

+1

Das ist wirklich kein Regex-Problem ... Sie * können * sie verwenden, aber sehr unnötig. – Tom

Antwort

1

Ihr Text wird 1.

/^(.*?)%/ 

Hinweis in der Gruppe sein: Dies alles auf das Prozentzeichen erfassen wird. Wenn Sie einschränken möchten, was Sie erfassen, ersetzen Sie die. mit der escape sequence Ihrer Wahl.

+1

Wie ich bereits erwähnt habe, ist Regex für dieses Problem nicht notwendig, aber das ist zumindest das Richtige :-). – Tom

+0

Ich stimme zu, nur die Frage zu beantworten :-) Die meisten Sprachen haben etwas viel einfacher für solche einfachen Aufgaben. –

+0

... wie Ihre Antwort deutlich zeigt. –

0

Sie müssen Regex nicht verwenden, wenn Sie nicht möchten. Abhängig von der Sprache, die Sie verwenden, wird es eine Art von String-Funktion wie Split() geben.

$str = "sometext%some_other_text"; 
$s = explode("%",$str,2); 
print $s[0]; 

dies in PHP ist, spaltete es auf% und dann das erste Element des zurückgegebenen Arrays erhalten. ähnlich auch in anderen Sprachen mit Splitting-Methoden.

+0

Obwohl dies wahrscheinlich kein großes Problem wäre, werde ich es noch einmal erwähnen, so ist es in diesem Post. "explodieren" ist ein bisschen unnötig, da es sich um die ganze Zeichenfolge handelt.Es erstellt auch eine Liste (und zusätzliche String-Objekte). Substringing ist konzeptionell einfacher und schneller, da es nicht erforderlich ist, den gesamten String zu betrachten. (Um das erste Vorkommen eines Trennzeichens zu finden, muss nicht die gesamte Zeichenkette betrachtet werden). – Tom

+0

Was ist, wenn der Teilstring, den Sie suchen, so nahe am Ende ist? das betrachtet auch die ganze Saite. "substringing" beinhaltet 2 Schritte, einen, um den Index zu finden, zweitens den Teilstring. Beides beinhaltet den Aufruf von 2 Funktionen. Ist das schneller als das Aufrufen von Elementen im Speicher (dh Array)? Hast du eine Möglichkeit, diese beiden Methoden zu vergleichen, um mich zu überzeugen, was du sagst? :) – ghostdog74

0

In Python können Sie verwenden:

def GetStuffBeforeDelimeter(str, delim): 
    return str[:str.find(delim)] 

In Java:

public String getStuffBeforeDelimiter(String str, String delim) { 
    return str.substring(0, str.indexOf(delim)); 
} 

In C++ (ungetestet):

using namespace std; 
string GetStuffBeforeDelimiter(const string& str, const string& delim) { 
    return str.substr(0, str.find(delim)); 
} 

In all den obigen Beispielen Sie wollen behandeln Sie Eckkästen, wie Ihre Schnur, die den Begrenzer nicht enthält.

Grundsätzlich würde ich substring für etwas so einfach verwenden, weil Sie vermeiden können, die gesamte Zeichenfolge zu scannen. Regex ist Overkill, und "Explodieren" oder Splitting auf dem Delimeter ist auch nicht notwendig, weil es auf die gesamte Zeichenfolge schaut.

+0

natürlich überlasse ich dem Leser die Fehlerbehandlung als Übung, aber das ist die Idee :-). – Tom

+0

substring schaut auf die ganze Zeichenfolge auch richtig? Sie müssen find() (in Python) oder indexOf (in Java) verwenden, um den Index zu finden. – ghostdog74

+0

@ ghostdob74: Teilstring muss nicht die ganze Zeichenfolge betrachten. Es kann nur den Teil betrachten, den du substringest. Außerdem muss index_of oder find nur bis zum ersten Auftreten des Delimeters scannen und dann aufhören ... es scannt nicht bis zum Ende, es sei denn, das Delimeter befindet sich am Ende oder nicht in der Zeichenfolge. – Tom

0

Sie sagen nicht, welchen Geschmack von Regex, also werde ich Perl-Notation verwenden.

/^[^%]*/m 

Die ersten ^ ist ein Anfang anchor: in der Regel paßt es nur den Anfang der ganzen Reihe, aber diese regex ist in mehrzeiligen Modus dank die ‚m‘ modifier am Ende. [^%] ist eine invertierte character class: Es entspricht einem beliebigen Zeichen außer einem '%'. Die * ist eine quantifier, die bedeutet, dass die vorherige Sache ([^%] in diesem Fall) null oder mehrere Male übereinstimmen.

Verwandte Themen