2016-03-04 21 views
8

Ho una stringa simile a questa: "texthere^D123456_02". Ma voglio che il mio risultato sia D123456.Sottostringa IndexOf in C#

questo è quello che faccio finora:

if (name.Contains("_")) 
{ 
name = name.Substring(0, name.LastIndexOf('_')); 
} 

Con questo posso rimuovere almeno il _02, se provo allo stesso modo per ^ poi ho sempre tornare texthere, anche quando uso name.IndexOf("^")

Ho anche provato solo a verificare ^, per ottenere almeno il risultato: D123456_02 ma sempre lo stesso risultato.

Ho anche provato a name.Replace("^" e quindi utilizzare il modo sottostringa che ho usato prima. Ma di nuovo il risultato rimane lo stesso.

texthere non è sempre la stessa lunghezza, quindi .Remove() è fuori questione.

Cosa sto sbagliando?

Grazie

+3

Si potrebbe dividere il carattere^e prendere solo la seconda parte. Ma penso che un'opzione migliore sarebbe usare le espressioni regolari. – Matthijs

risposta

8

Quando la chiamata Substring non si deve iniziare da , ma dal l'indice trovato:

String name = "texthere^D123456_02"; 

    int indexTo = name.LastIndexOf('_'); 

    if (indexTo < 0) 
    indexTo = name.Length; 

    int indexFrom = name.LastIndexOf('^', indexTo - 1); 

    if (indexFrom >= 0) 
    name = name.Substring(indexFrom + 1, indexTo - indexFrom - 1); 
+0

Mentre più complesso questo è l'unico approccio che non crea stringhe non necessarie e temporanee – Steve

+0

Impressionante, questo ha funzionato bene grazie: D – Desutoroiya

2

Un modo più semplice sarebbe quella di utilizzare Split

string s = "texthere^D123456_02"; 

string[] a = s.Split('^', '_'); 

if (a.Length == 3) // correct 
{ 
} 
2

La soluzione più semplice sarebbe dividere prima la stringa, quindi utilizzare la tua soluzione originale per la seconda parte.

string name = "texthere^D123456_02"; 
string secondPart = name.Split('^')[1]; // This will be D123456_02 

Successivamente è possibile utilizzare la sottostringa come prima.

3

utilizzare il metodo String.Split:

var split1 = name.Split('^')[1]; 
    var yourText = split1.Split('_')[0]; 

Oppure si potrebbe usare RegExp per ottenere fondamentalmente la stessa.

2
string s = "texthere^D123456_02"; 
      string result= s.Substring(s.IndexOf("^") + 1);//Remove all before 
      result = result.Remove(result.IndexOf("_"));//Remove all after 
3

Beh, se si utilizza lo stesso codice che hai postato, che sta facendo la cosa giusta, si inizia a recuperare i caratteri dal carattere 0 e si ferma quando trova "^", in modo da che cosa otterrete è "texthere ".

Se si desidera solo il valore, quindi utilizzare questo:

name = name.Substring(0, name.LastIndexOf('_')).Substring(name.IndexOf("^") + 1); 

Sarà prima rimuovere tutto ciò che è dopo il "_" e tutto ciò che è prima di "^".

3

Substring prende una posizione e una lunghezza, quindi è necessario capire in realtà fuori dove la vostra posizione del cursore è e dove la sottolineatura è quello di calcolare la lunghezza

var name = "texthere^D123456_02"; 

if(name.Contains('_')) 
{ 
    var caretPos = name.IndexOf('^') + 1; // skip ahead 
    var underscorePos = name.IndexOf('_'); 
    var length = underscorePos - caretPos; 
    var substring = name.Substring(caretPos, length); 
    Debug.Print(substring); 
}; 
2
String name = "texthere^D123456_02" 
    print name.split('_', '^')[1] 

Questo divide la stringa in tutte le occorrenze di _ e^e restituisce l'elenco di stringhe dopo la divisione. Dal momento che la stringa di cui hai bisogno D123456 sarebbe al primo indice (cioè la 2a posizione), l'ho stampata.

3

Con Regular Expression

string s = "texthere^D123456_02"; 
Regex r1 = new Regex(@"\^(.*)_"); 
MatchCollection mc = r1.Matches(s); 
Console.WriteLine("Result is " + mc[0].Groups[1].Value); 
+0

sei sicuro della risposta? – Media

+0

sì, sono sicuro @media –

3

uso regex.

Regex regex = new Regex(@"\^(.*)_"); 
Match match = regex.Match(name); 

if(match.Success) 
{ 
    name= match.Groups[1].Value 
} 
3

Un'alternativa a ciò che è già stato suggerito è quello di utilizzare espressioni regolari:

string result = Regex.Match("texthere^D123456_02", @"\^(.*)_").Groups[1].Value; // D123456 
2

Se si vogliono semplicemente il "d123456" è semplice con solo String.Split() non c'è bisogno di altro. Basta definire l'indice che vuoi dopo. Ci sono sovraccarichi su Split() proprio per questo motivo.

//... 

var source = "texthere^D123456_02"; 
var result = source.Split(new char[] {'^', '_'}, StringSplitOptions.RemoveEmptyEntries)[1]; 
Console.WriteLine(result); 
//Outputs: "D123456" 

Spero che questo aiuti.

3

Prova questo e fammi sapere come va

string inputtext = "texthere^D123456_02"; 
    string pattern = @".+\^([A-Z]+[0-9]+)\_[0-9]+"; 

    string result = Regex.Match(inputtext, pattern).Groups[1].Value; 
+1

I gruppi [0] restituiscono l'intera corrispondenza, dovrebbe essere Gruppi [1] – nkoniishvt