2016-06-29 11 views
3

für diesen Moment i Strings wie diese: "document.info.userId" (json Eigenschaft Pfade) und RegexMuster sie bestätigen: ([\w]+\.)+[\w]+$Regex Mathe Weg mit spezifischen Symbolen

aber es scheint Zeichenfolge wie folgt zu sein: "document.role#0.id" (etwas mehr Markup für Arrays) und sie sind gültig für, aber ich kann nicht herausfinden, welche Regexp-Muster zu verwenden. Dieser Index (# 0, # 1, usw.) kann nur vor dem Punkt, nicht in der Mitte eines beliebigen Pfadteils stehen.

Ich habe bereits versucht, Muster ([\w#]+\.)+[\w#]+$ und ([\w]+(#\d+)*\.)+[\w]+(#\d+)*$ aber sie passieren ungültige Pfade wie folgt aus: test.some#a.hello

passieren sollte:

"document.role.id" 
"document.role.id.and.other.very.long.path.example" 
"document.role#0.id" 
"document#1.role#0.id" 
"document#1.role#0#1.id" 
"document#1.role#0#1.id#21" - terrible representation of array in array 

Sollte nicht passieren:

"document." 
"document.role." 
".document" 
"test.some#a.hello" 
"docum#ent.role.id" 
"document.role.#id" 
"docu#1ment.role.id" 
"document.ro#0#1le.id" 
+0

weitere Beispiele hinzugefügt – aleha

+0

Sie eine Spezifikation der Syntax haben Sie? JsonPath ist eine Alternative zu Ihrer Syntax, die als eine Art "XPath für JSON" definiert ist. –

+0

nur Unterschiede bei der Indizierung von Arrays wie dieser #N – aleha

Antwort

3

Versuchen

^\w+(?:#\d+)*(?:\.\w+(?:#\d+)*)*$ 

Es beginnt mit durch eine beliebige Anzahl von Indizes (#N), gefolgt für ein Wort zu prüfen. Dies kann optional durch eine beliebige Anzahl von . und die gleiche Prüfung (ein Wort und Indizes) gefolgt werden.

Check it out here at regex101.

+1

regex101 ist für js, php und py – aleha

+0

True, aber die Regex Shoukd funktioniert auch in C#. – ClasG

+0

überprüft auf http://regexstorm.net/tester funktioniert gut. Danke. – aleha

3

Sie hinzufügen ein optionales #[\d]:

^([\w]+(#[\d])*\.)+[\w]+$ 
     ^^^^^^^^ 

Auf diese Weise kann der Text #N, N ist eine ganze Zahl, kann oder kann nicht passieren.

Sehen Sie es mit etwas Abtastwerteingang leben in https://regex101.com/r/mZ3mZ6/2

Berücksichtigung aller Proben, die Sie später hinzugefügt:

^([\w]+(#[\d]+)*\.)+[\w]+(#[\d]+)*$ 

So können wir für #N auch prüfen, wobei n eine ganze Zahl (nicht nur eine Ziffer) und erlaubt auch, dass der letzte Block einen solchen Spezifizierer enthält.

Sehen Sie es live in https://regex101.com/r/mZ3mZ6/3 über alle Fälle.

+0

dieser pass: document # 1.creati # 1onInfo.userId – aleha

+0

Sollte '^ ([\ w] + (# [\ d]) * \.) + [\ W] + $ '. '*' anstelle von '?', weil es in der Lage sein muss, mehrere Vorkommen von '# N', d. h.' # 0 # 1 # 2', zu treffen. Sie haben auch vergessen, das '^' zu kopieren. – Chrono

+0

@aleha Ich habe vergessen, '^' hinzuzufügen, die in der Verbindung war. Aktualisiert. – fedorqui

0

lange Lösung funktioniert aber:

^(\w+(?:(#[\d]+)*)?\.)(\w+(?:(#[\d]+)*)?\.)+(\w+(?:(#[\d]+)*)?)