Implementationen des UND-regex Betreiber existieren. Die Sprache hat es (notiert als &
) sowie den Negationsoperator notiert ~
. Wie Sie sehen können, ist es jedoch nicht auf das Problem anwendbar. Vielmehr können wir sie verwenden Strings übereinstimmen, die mit einem Raum nicht und beginnen, die mit einem ]
nicht am Ende:
$ txr
This is the TXR Lisp interactive listener of TXR 147.
Use the :quit command or type Ctrl-D on empty line to exit.
1> (defun complete-match (regex string)
(= (match-regex string regex) (length string)))
complete-match
2> (complete-match #/~ .*&~.*\]/ "")
t
3> (complete-match #/~ .*&~.*\]/ "a")
t
4> (complete-match #/~ .*&~.*\]/ "abc")
t
5> (complete-match #/~ .*&~.*\]/ " abc")
nil
6> (complete-match #/~ .*&~.*\]/ "abc]")
nil
7> (complete-match #/~ .*&~.*\]/ "]")
nil
8> (complete-match #/~ .*&~.*\]/ " ]")
nil
9> (complete-match #/~ .*&~.*\]/ " ")
nil
10> (complete-match #/~ .*&~.*\]/ "] ")
t
Die complete-match
Funktion, die wir kurz zurückkehrt definieren t
(true) oder nil
(false) wenn die Eingabezeichenfolge vollständig dem regulären Ausdruck entspricht. (Der durch die Regex bezeichnete Automat erreicht bei der Verarbeitung aller Zeichen der Zeichenfolge einen Annahmezustand.)
Die Regex ist ~ .*&~.*\]
. Der Operator &
hat eine niedrige Priorität, daher können wir ihn in Klammern setzen als (~ .*)&(~.*\])
: Es ist eine UND-Verknüpfung von zwei Ausdrücken. Der Negationsoperator ~
hat eine niedrigere Priorität als die Verkettung, also bedeutet ~abc
"passt für alles andere als abc
": es bedeutet nicht [^a]bc
. So bezeichnet ~ .*
die Menge der Zeichenfolgen, die nicht mit einem Leerzeichen beginnen, und ~.*\]
bezeichnet die Menge der Zeichenfolgen, die nicht mit ]
enden. (Dies muss in dieser Regex-Implementierung maskiert werden, da es ein regex-syntaktisches Zeichen ist).
Diese negierten Sätze enthalten leere Zeichenfolgen. Die leere Zeichenfolge entspricht ~ .*
, da eine leere Zeichenfolge nicht mit einem Leerzeichen beginnt.
Um das Problem der Trimmen einen optionalen führenden Raumes zu lösen oder ]
Hinter wir einfach zwei aufeinander folgende Regex Ersetzungen durchführen können: ein führenden Raum löschen, wenn überhaupt, und dann einen nachgestellte ‚]‘ löschen, falls vorhanden. Die "and" -Logik übersetzt sich in sukzessive Transformationsschritte: tue dies, um A einzugeben, um B zu erzeugen, und tue dann B, um Ergebnis C zu erzeugen.
Reguläre Ausdrücke sind für die Aufgabe nicht erforderlich, weil Sie einfach testen können, ob das führende Zeichen des Strings ein Leerzeichen ist, und bedingt entweder den Rest des Strings oder den ganzen String. In ähnlicher Weise behandeln Sie den Schwanz:
1> (defun trim-leading-char (str ch)
(if (equal [str 0..1] `@ch`)
[str 1..:]
str))
trim-leading-char
2> (defun trim-trailing-char (str ch)
(if (equal [str -1..:] `@ch`)
[str 0..-1]
str))
trim-trailing-char
3> (trim-leading-char " abc]" #\space)
"abc]"
4> (trim-trailing-char " abc]" #\])
" abc"
5> (trim-trailing-char (trim-leading-char " abc]" #\space) #\])
"abc"
Wirklich, kein _and_ Operator. Es genügt, beide Spezifikationen in die Regex zu schreiben. – sln
Sie benötigen dafür keinen AND-Operator. Sie benötigen alle Zeichen nach dem führenden Leerzeichen und vor dem abschließenden ']'. Das ist einfach genug, um einen RE zu schreiben. Etwas wie "^. * \] $" ', Irrtümer und Auslassungen vorbehalten. Und Sie brauchen 'Replace()' nicht, Sie brauchen, was auch immer die Match-API in welcher Sprache und API auch immer ist. – EJP
Ich habe versucht zu tun, aber '" ^. * \] $ "' Ist unmöglich – MinhKiyo