2011-11-08 3 views
3

У меня есть массив строк string[] arr, который содержит значение, как N36102W114383, N36102W114382 и т.д. ...
Я хочу, чтобы разделить каждую строку так, что значение приходит как этот N36082 и W115080.Разбивает массив строк

Каков наилучший способ для этого?

+2

Какой язык? ИМО вы не __want__ для использования регулярного выражения для этого. – Kimvais

+2

что-то вроде этого? '(N \ d +) (W \ d +)' или '(N [0-9] +) (W [0-9] +)' – fardjad

+0

На каком языке вы используете? –

ответ

0

Прости меня, если это не совсем обобщать, но я просто сломать и написать функции обработки строк вручную:

public static IEnumerable<string> Split(string str) 
{ 
    char [] chars = str.ToCharArray(); 
    int last = 0; 
    for(int i = 1; i < chars.Length; i++) { 
     if(char.IsLetter(chars[i])) { 
      yield return new string(chars, last, i - last); 
      last = i; 
     } 
    } 

    yield return new string(chars, last, chars.Length - last); 
} 
1

Это должно работать для вас.

Regex regexObj = new Regex(@"\w\d+"); # matches a character followed by a sequence of digits 
Match matchResults = regexObj.Match(subjectString); 
while (matchResults.Success) { 
    matchResults = matchResults.NextMatch(); #two mathches N36102 and W114383 
} 
0

Если у вас есть фиксированный формат каждый раз, когда вы можете просто сделать это:

string[] split_data = data_string.Insert(data_string.IndexOf("W"), ",") 
    .Split(",", StringSplitOptions.None); 

Здесь вы вставляете узнаваемый разделитель в вашу строку, а затем разделить его этим разделителем.

0

Использование строковых функций «Split» и «IsLetter», это относительно легко в C#.

Не забудьте написать модульные тесты - следующие могут иметь ошибки в угловом корпусе!

// input has form "N36102W114383, N36102W114382" 
    // output: "N36102", "W114383", "N36102", "W114382", ... 
    string[] ParseSequenceString(string input) 
    { 
     string[] inputStrings = string.Split(','); 

     List<string> outputStrings = new List<string>(); 

     foreach (string value in inputstrings) { 
      List<string> valuesInString = ParseValuesInString(value); 
      outputStrings.Add(valuesInString); 
     } 

     return outputStrings.ToArray(); 
    } 

    // input has form "N36102W114383" 
    // output: "N36102", "W114383" 
    List<string> ParseValuesInString(string inputString) 
    { 
     List<string> outputValues = new List<string>(); 
     string currentValue = string.Empty; 
     foreach (char c in inputString) 
     { 
      if (char.IsLetter(c)) 
      { 
       if (currentValue .Length == 0) 
       { 
        currentValue += c; 
       } else 
       { 
        outputValues.Add(currentValue); 
        currentValue = string.Empty; 
       } 
      } 
      currentValue += c; 
     } 
     outputValues.Add(currentValue); 
     return outputValues; 
    } 
0

Если вы используете C#, пожалуйста, попробуйте:

String[] code = new Regex("(?:([A-Z][0-9]+))").Split(text).Where(e => e.Length > 0 && e != ",").ToArray(); 
0

в случае, если вы ищете только для формата NxxxxxWxxxxx, это будет делать только штрафом:

Regex r = new Regex(@"(N[0-9]+)(W[0-9]+)"); 

Match mc = r.Match(arr[i]); 
string N = mc.Groups[1]; 
string W = mc.Groups[2]; 
Смежные вопросы