2009-11-11 17 views

risposta

57

Una RegEx-free soluzione:

string ExtractString(string s, string tag) { 
    // You should check for errors in real-world code, omitted for brevity 
    var startTag = "<" + tag + ">"; 
    int startIndex = s.IndexOf(startTag) + startTag.Length; 
    int endIndex = s.IndexOf("</" + tag + ">", startIndex); 
    return s.Substring(startIndex, endIndex - startIndex); 
} 
+2

Cosa si può fare per ottenere valore se sono multipli dello stesso tag? – Jamil

90
Regex regex = new Regex("<tag1>(.*)</tag1>"); 
    var v = regex.Match("morenonxmldata<tag1>0002</tag1>morenonxmldata"); 
    string s = v.Groups[1].ToString(); 

Or (come accennato nei commenti) per abbinare il sottoinsieme minimo:

Regex regex = new Regex("<tag1>(.*?)</tag1>"); 

Regex classe è in System.Text.RegularExpressions namespace.

+9

Questo è pericoloso! In questa strig: "aa bbb ccc ddd eee" tornerà "bbb ccc ddd" – Kugel

+16

@Aaron: (. *) Utilizzare un match non avido modificando '' a '(. *?) '- questo impedirà una corrispondenza errata come menzionato da @Kugel. –

9

Un Regex approccio utilizzando partita pigro e back-reference:

foreach (Match match in Regex.Matches(
     "morenonxmldata<tag1>0002</tag1>morenonxmldata<tag2>abc</tag2>asd", 
     @"<([^>]+)>(.*?)</\1>")) 
{ 
    Console.WriteLine("{0}={1}", 
     match.Groups[1].Value, 
     match.Groups[2].Value); 
} 
1

Per riferimento futuro, ho trovato questo frammento di codice a http://www.mycsharpcorner.com/Post.aspx?postID=15 Se è necessario cercare "tag" diversi funziona molto bene.

public static string[] GetStringInBetween(string strBegin, 
     string strEnd, string strSource, 
     bool includeBegin, bool includeEnd)   
    { 
     string[] result ={ "", "" }; 
     int iIndexOfBegin = strSource.IndexOf(strBegin); 
     if (iIndexOfBegin != -1) 
     { 
      // include the Begin string if desired 
      if (includeBegin) 
       iIndexOfBegin -= strBegin.Length; 
      strSource = strSource.Substring(iIndexOfBegin 
       + strBegin.Length); 
      int iEnd = strSource.IndexOf(strEnd); 
      if (iEnd != -1) 
      { 
       // include the End string if desired 
       if (includeEnd) 
        iEnd += strEnd.Length; 
       result[0] = strSource.Substring(0, iEnd); 
       // advance beyond this segment 
       if (iEnd + strEnd.Length < strSource.Length) 
        result[1] = strSource.Substring(iEnd 
         + strEnd.Length); 
      } 
     } 
     else 
      // stay where we are 
      result[1] = strSource; 
     return result; 
    } 
-8
public string between2finer(string line, string delimiterFirst, string delimiterLast) 
    { 
     string[] splitterFirst = new string[] { delimiterFirst }; 
     string[] splitterLast = new string[] { delimiterLast }; 
     string[] splitRes; 
     string buildBuffer; 
     splitRes = line.Split(splitterFirst, 100000, System.StringSplitOptions.RemoveEmptyEntries); 
     buildBuffer = splitRes[1]; 
     splitRes = buildBuffer.Split(splitterLast, 100000, System.StringSplitOptions.RemoveEmptyEntries); 
     return splitRes[0]; 
    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     string manyLines = "Received: from exim by isp2.ihc.ru with local (Exim 4.77) \nX-Failed-Recipients: [email protected]\nFrom: Mail Delivery System <[email protected]>"; 
     MessageBox.Show(between2finer(manyLines, "X-Failed-Recipients: ", "\n")); 
    } 
+2

Che cosa ha a che fare quel codice per il clic del pulsante? O il magico numero 100000? – rossisdead

0

spoglierò prima e dopo i dati.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Text.RegularExpressions; 

namespace testApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string tempString = "morenonxmldata<tag1>0002</tag1>morenonxmldata"; 
      tempString = Regex.Replace(tempString, "[\\s\\S]*<tag1>", "");//removes all leading data 
      tempString = Regex.Replace(tempString, "</tag1>[\\s\\S]*", "");//removes all trailing data 

      Console.WriteLine(tempString); 
      Console.ReadLine(); 
     } 
    } 
} 
0

Senza RegEx, con alcuni devono avere un valore-controllando

public static string ExtractString(string soapMessage, string tag) 
    { 
     if (string.IsNullOrEmpty(soapMessage)) 
      return soapMessage; 

     var startTag = "<" + tag + ">"; 
     int startIndex = soapMessage.IndexOf(startTag); 
     startIndex = startIndex == -1 ? 0 : startIndex + startTag.Length; 
     int endIndex = soapMessage.IndexOf("</" + tag + ">", startIndex); 
     endIndex = endIndex > soapMessage.Length || endIndex == -1 ? soapMessage.Length : endIndex; 
     return soapMessage.Substring(startIndex, endIndex - startIndex); 
    } 
6

contenuti Estrazione tra due valori noti può essere utile per dopo pure. Quindi, perché non creare un metodo di estensione per questo. Qui è quello che faccio, breve e semplice ...

public static string GetBetween(this string content, string startString, string endString) 
    { 
     int Start=0, End=0; 
     if (content.Contains(startString) && content.Contains(endString)) 
     { 
      Start = content.IndexOf(startString, 0) + startString.Length; 
      End = content.IndexOf(endString, Start); 
      return content.Substring(Start, End - Start); 
     } 
     else 
      return string.Empty; 
    } 
+0

blocco di codice molto utile in effetti – Crezzer7

3
string input = "Exemple of value between two string FirstString text I want to keep SecondString end of my string"; 
var match = Regex.Match(input, @"FirstString (.+?) SecondString ").Groups[1].Value; 
Problemi correlati