2016-08-30 5 views
0

Ich habe 2 Zeichenfolge wie folgt:Regulärer Ausdruck UND Operator?

string str = " 2016/07/19 19:47:46]"; 
string str1 = " Origin (2)]"; 

ich mit einem Raum zu bekommen startet das Ergebnis nicht und nicht mit einer Markierung enden]

"2016/07/19 19:47:46"; 
"Origin (2)"; 

I Muster Bespannbild verwendet = @“^[^ \ S] ", aber UND-Operator weiß ich nicht.

string result = Regex.Replace(str, @"^[^\S]", ""); 

Jede Hilfe wird sehr geschätzt.

+1

Wirklich, kein _and_ Operator. Es genügt, beide Spezifikationen in die Regex zu schreiben. – sln

+1

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

+0

Ich habe versucht zu tun, aber '" ^. * \] $ "' Ist unmöglich – MinhKiyo

Antwort

1

Nicht Raum bei BOL ODER nicht Zeichen bei EOL:

(?m)^(?:\S.*|.*[^\]])$

Ich denke, die UND Version ist:

(?m)^\S.*[^\]]$

Ein weiterer UND Version die Erlaube 0 oder mehr Zeichen, ist:

(?m)^(?!\s).*(?<!\])$

+0

danke, ich werde bestätigen – MinhKiyo

1

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" 
+0

Vielen Dank für Ihre ausführliche Erklärung, ich habe viele Dinge gelernt. – MinhKiyo