2016-10-04 3 views
0

Ich scheine einen Reg Ausdruck ein Jahr zu schreiben und immer am Ende um Hilfe bitten.REGEX Suche Strings innerhalb einer Zeichenfolge

Hier ist eine Zeichenfolge (es ist eine Suchzeichenfolge von Solr) und ich möchte jede Instanz des Suchwortes auswählen.

Hier ist der Eingang: -

http://server:8080/solr/app/select?q=(title_st_en%3Atheory+OR+title_st_ar%3Atheory+OR+title_st_da%3Atheory+OR+title_st_fr%3Atheory+OR+title_st_de%3Atheory+OR+title_st_it%3Atheory+OR+title_st_no%3Atheory+OR+title_st_sv%3Atheory+OR+title_st_ru%3Atheory+OR+title_st_es%3Atheory+OR+title_st_bg%3Atheory+OR+title_st_cs%3Atheory+OR+title_st_tr%3Atheory+OR+title_st_nl%3Atheory+OR+title_st_zh-cn%3Atheory+OR+title_st_zh-tw%3Atheory+OR+title_st_hr%3Atheory+OR+title_st_et%3Atheory+OR+title_st_he%3Atheory+OR+title_st_hu%3Atheory+OR+title_st_ja%3Atheory+OR+title_st_ko%3Atheory+OR+title_st_pl%3Atheory+OR+title_st_ro%3Atheory+OR+title_st_th%3Atheory+OR+title_st_vi%3Atheory+OR+content_stemming_en%3Atheory+OR+content_stemming_no%3Atheory+OR+(backfields%3Atheory))+AND+(((virtualPath%3A%22%5C%5CSERVER%5C%5CU_TEST%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_SYSTEM%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_!CONTACTS%22)+AND+-(virtualPath%3A%22%5C%5CSERVER%5C%5CU_TEST%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_SYSTEM%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_NDSF%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_NDSFMAG%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_NDSFRA%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_NM%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_INTERNAL%5C%5CL%22+OR+virtualPath%3A 

Ich brauche einen beliebigen Text zwischen jedem '%3A' und '+OR' sowie die letzte '%3Atheory))' wählen - in diesem Fall das Wort 'theory' aber es wird jedes Mal ein anderes Wort sein - das einzig bekannte ist, dass es ein beliebiger Alpha-Text zwischen dem "%3A" und dem "+OR" sein wird. Und es müssen im ‚+AND+‘ stoppen

Ich habe so weit wie /%3A(.*?)[+OR]/g bekam - es ist ein Anfang Ich denke, ... Es ist nicht finden ‚%3Atheory))‘ und es hört nicht auf ‚+AND+

Ich kämpfe mit 'finden Sie' oder 'finden Sie das' sowie an einer Schnur zu stoppen.

jemand bieten einige anleitung?

+1

So etwas wie [dies] (https://regex101.com/r/xhEq1j/1)? –

+0

Ja! Ich hatte nicht bemerkt, dass ich jeder nahen Klammer entkommen musste. Fast da - ich brauche etwas, um mit dem Ausdruck '+ AND +' aufzuhören. –

+0

Wie [so] (https://regex101.com/r/xhEq1j/2)? –

Antwort

0

Wenn Sie mit es könnte besser sein, in zwei Operationen wie so mit String.Split und die Regex.Matches aufzuspalten:

string input = @"http://server:8080/solr/app/select?q=(title_st_en%3Atheory+OR+title_st_ar%3Atheory+OR+title_st_da%3Atheory+OR+title_st_fr%3Atheory+OR+title_st_de%3Atheory+OR+title_st_it%3Atheory+OR+title_st_no%3Atheory+OR+title_st_sv%3Atheory+OR+title_st_ru%3Atheory+OR+title_st_es%3Atheory+OR+title_st_bg%3Atheory+OR+title_st_cs%3Atheory+OR+title_st_tr%3Atheory+OR+title_st_nl%3Atheory+OR+title_st_zh-cn%3Atheory+OR+title_st_zh-tw%3Atheory+OR+title_st_hr%3Atheory+OR+title_st_et%3Atheory+OR+title_st_he%3Atheory+OR+title_st_hu%3Atheory+OR+title_st_ja%3Atheory+OR+title_st_ko%3Atheory+OR+title_st_pl%3Atheory+OR+title_st_ro%3Atheory+OR+title_st_th%3Atheory+OR+title_st_vi%3Atheory+OR+content_stemming_en%3Atheory+OR+content_stemming_no%3Atheory+OR+(backfields%3Atheory))+AND+(((virtualPath%3A%22%5C%5CSERVER%5C%5CU_TEST%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_SYSTEM%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_!CONTACTS%22)+AND+-(virtualPath%3A%22%5C%5CSERVER%5C%5CU_TEST%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_SYSTEM%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_NDSF%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_NDSFMAG%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_NDSFRA%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_NM%5C%5CL%22+OR+virtualPath%3A%22%5C%5CSERVER%5C%5CP_INTERNAL%5C%5CL%22+OR+virtualPath%3A"; 
Regex regex = new Regex(@"%3A(.*?)(?:\+OR|\)\))"); 

var splitted = input.Split(new[] { "AND" }, StringSplitOptions.None); 
var matches = regex.Matches(splitted.First()); 

foreach (Match m in matches) 
{ 
    // Or whatever you like to do with your matches 
    Console.WriteLine(m.Groups[1].Value); 
} 
0

Regex.Split hat eine Option, um die Trennung von Strings zu halten. Also für den Text in der Frage gegeben, Code wie das unten wird es in Stücke aufgeteilt:

string[] pieces = Regex.Split(theInputText, "(%3A.*?\\+(?:AND|OR))"); 
foreach (string ss in pieces) 
{ 
    Console.WriteLine(ss); 
} 

Hier ein kleiner Ausschnitt der Ausgabe ist:

+virtualPath 
%3A%22%5C%5CSERVER%5C%5CP_SYSTEM%22+OR 
+virtualPath 
%3A%22%5C%5CSERVER%5C%5CP_!CONTACTS%22)+AND 
+-(virtualPath 
%3A%22%5C%5CSERVER%5C%5CU_TEST%5C%5CL%22+OR 
+virtualPath 

Nachdem die Zeichenfolge in Stücke geteilt es sollte Es ist eine einfache Angelegenheit, nach den Array-Elementen mit den korrekten Start- und Endzeichen zu suchen, auch um den letzten %3Atheory... Eintrag zu finden.

Hinweis: Die Frage diskutiert +OR und +AND+ aber alle +OR s befolgt mit einem + so kann es besser sein, eine endgültige + im Ausdruck enthalten, wie ...OR)\\+).

Hinweis: Die inneren Klammern im regulären Ausdruck erfassen nicht, dh (?: ). Wenn sie Klammern erfassen würden, würden die AND und OR Erfassungen im Ausgabearray enthalten sein.

Verwandte Themen