2017-01-26 8 views
1

Ich versuche regexr.com zu verwenden, um einen Ausdruck zu schreiben, der bestimmten Zahlen in den Dateinamen unten entspricht. Der Ausdruck wird dann in einer PHP-Methode preg_match() verwendet, um Dateien zu identifizieren, die sich auf dem Server befinden sollten. Nicht übereinstimmende Dateien werden gelöscht.Genaue Nummer in einer gegebenen Zeichenkette finden

In diesem Beispiel soll der Ausdruck 187906 und 187909 übereinstimmen (die anderen Dateien können also gelöscht werden). Ich dachte, ich könnte schreiben (187906 | 187909) was funktioniert, aber das würde natürlich auch mit 11879066 oder 11879099 übereinstimmen und so weiter. Vor und nach der Nummer wird immer ein nicht numerisches Zeichen sein; entweder alphabetisch oder als Punkt.

-rw-r--r--. 1 root root 2190476 Jan 26 16:48 source187905.jpg 
-rw-r--r--. 1 root root 1691755 Jan 26 16:48 source187906.jpg 
-rw-r--r--. 1 root root 1780389 Jan 26 16:48 source187907.jpg 
-rw-r--r--. 1 root root 1692330 Jan 26 16:48 source187908.jpg 
-rw-r--r--. 1 root root 1622615 Jan 26 16:48 source187909.jpg 
+0

\ D ist ein nicht-numerisches Zeichen so '\ D (187906 | 187909) \ D' Ich denke, würde es tun. oder Sie könnten eine Zeichenklasse für Alpha oder Full-Stop verwenden. – chris85

Antwort

2

Verwenden lookarounds(?<!\d) und (?!\d):

/(?<!\d)(?:187906|187909)(?!\d)/ 

die regex demo See.

Das negative Lookbehindschlägt fehl, wenn eine Ziffer vor einer der beiden Ziffern vorhanden ist und (?!\d) negativer Lookahead die Übereinstimmung nicht besteht, wenn eine Ziffer nach einer der beiden Ziffern vorhanden ist.

Da diese Zahl am Ende des Dateinamens mit einer bestimmten Erweiterung aussieht, können Sie sogar

/(?<!\d)(?:187906|187909)\.jpg$/i 

verwenden, wo \.jpg$ wird .jpg am Ende der Schnur ($) und /i Modifikator entsprechen macht das Muster unsensibel.

+1

Das funktioniert für mich und ich danke Ihnen für Ihre Antwort. :-) – Reado

Verwandte Themen