2016-06-21 12 views
0

Ich möchte regexp Suche nach der = Zeichen, die möglicherweise Leerzeichen auf beiden Seiten haben kann, und möglicherweise am Anfang oder Ende einer Zeile. Ich habe ein paar versucht:Wie reguläre Suche nach =, aber nicht> =, ==, <=,! =, ~ = Usw. in Emacs?

  • = funktioniert nicht, weil es == Spiele, >= usw.
  • [^<>=]=[^<>=] funktioniert nicht, weil sie die beiden Zeichen fängt unmittelbar vor und nach dem = Zeichen, die unerwünscht ist
  • ich dachte \_< und \_> nützlich sein könnte, aber ich kann

In Vim nicht herausfinden, was für diese sind, gibt es \zs und \ze, die den Anfang und das Ende einer Übereinstimmung angeben, so dass ich nur für den Kontext mit den umgebenden Zeichen übereinstimmen kann. Aber Emacs hat diese nicht.

Ist das mit Emacs möglich?

+0

In Emacs ist alles möglich. Dies funktioniert nicht für Sie ?: '[^ <> =! ~]? =? [^ =]'. Mit welchem ​​Befehl suchen Sie? – elethan

+0

@elethan Das fängt sogar * mehr * Zeichen als ich will. Ich suche nur das '=' wie gesagt. – rityzmon

+0

Ah ja, ich habe das schon mal gelesen, aber jetzt verstehe ich was du meinst. Es klingt, als ob Sie ein negatives Lookahead oder Lookbehind benötigen, und ich denke, dass diese in Lisp Regexps nicht unterstützt werden. Zumindest erinnere ich mich daran, aber ich werde es mir ansehen, wenn ich wieder auf dem Desktop bin. – elethan

Antwort

2

Ihre Frage ist unterspezifiziert. Welche Charaktere verbieten Sie kurz vor und nach =? Sie erlauben Space Chars (was ist mit anderen Leerzeichen?). Aber erlauben Sie nur Leerzeichen (oder Leerzeichen)?

Zum Beispiel erlauben Sie a=b übereinstimmen? Wenn ja, dann sind vielleicht Briefe nicht verboten?

Sobald Sie klar angeben, welche Zeichen Sie zulassen und sofort vor und nach = verbieten, können Sie die Regexp schreiben. Aber da Sie nur die = in den übereinstimmenden Kontexten "erfassen" wollen, müssen Sie eine regexp Gruppe für die = verwenden und nur abrufen, was es entspricht, nachdem alles zusammenpasst.

Zum Beispiel [ ]*=[ ]* entspricht = möglicherweise von Space Chars umgeben. Aber wenn Sie nur die = in diesem Kontext erfassen möchten, müssen Sie [ ]*\\(=\\)[ ]* verwenden und dann (match-string 1) verwenden, um die = zu erhalten.

Sie sagen auch nicht, ob Sie Text in einem Puffer oder in einer Zeichenfolge übereinstimmen.

Und Sie sagen nicht, ob Sie dies interaktiv oder von einem Lisp-Programm tun möchten.

Der genaue Code, den Sie benötigen, hängt von diesen Dingen ab. Wenn Sie beispielsweise für die Suche interaktiv sind, müssen Sie Backslashes nicht doppelt verwenden. Wenn eine Zeichenfolge anstelle eines Puffers verwendet wird, müssen Sie die Zeichenfolge als zweites Argument an match-string übergeben.

Im Allgemeinen ist Ihre Frage unterspezifiziert, und die Antwort beinhaltet die Angabe dieser Dinge - insbesondere, welche Kontexte übereinstimmen (welche Zeichen vor und nach = zulässig sind) und welche Teile der übereinstimmenden Kontexte Sie möchten (nur die = oder die = plus einige der Zeichen vor und nach ihm) abrufen.