Member 8478234 Ответов: 3

Как извлечь определенные слова из предложения?


Я ищу лучший метод извлечения слов.

У меня есть предложение под названием TestTest-CustID : 1200005#14102016_0412-ARF или это может быть TestTest-CustID:1200005#14102016_0412 - ARF

Этот 'CustID : 1200005#' может быть с пробелами или без них. Мне нужно извлечь из этого "1200005".

string subject = "TestTest - CustID : 1200005#14102016_0412- ARF"

if (subject.Trim().Contains(CustID:))
                {
                    customerId = ExtractFromString(mailSubject, "CustID:","#");
                }
                else if (subject.Trim().Contains(CustID:))
                {
                    customerId = ExtractFromString(mailSubject, "CustID:","#");
                }
}
 
<pre lang="C#">private static List&lt;string&gt; ExtractFromString(string text, string startString, string endString)
       {
           List&lt;string&gt; matched = new List&lt;string&gt;();
           int indexStart = 0, indexEnd = 0;
           bool exit = false;
           while (!exit)
           {
               indexStart = text.IndexOf(startString);
               indexEnd = text.IndexOf(endString);
               if (indexStart != -1 &amp;&amp; indexEnd != -1)
               {
                   matched.Add(text.Substring(indexStart + startString.Length,
                       indexEnd - indexStart - startString.Length));
                   text = text.Substring(indexEnd + endString.Length);
               }
               else
                   exit = true;
           }
           return matched;
       }</pre>



Это работает, но я ищу какой-то лучший вариант, учитывая как CustID : 1200005# , так и CustID:1200005#

Что я уже пробовал:

То,что я пробовал, было приложено.


string subject = "TestTest - CustID : 1200005#14102016_0412- ARF"
if (subject.Trim().Contains("CustID"))
                {
                    customerId = ExtractFromString(mailSubject, "CustID:","#");
                }
                else if (subject.Trim().Contains(CustID:))
                {
                    customerId = ExtractFromString(mailSubject, "CustID:","#");
                }
}

<pre lang="C#">private static List&lt;string&gt; ExtractFromString(string text, string startString, string endString)
       {
           List&lt;string&gt; matched = new List&lt;string&gt;();
           int indexStart = 0, indexEnd = 0;
           bool exit = false;
           while (!exit)
           {
               indexStart = text.IndexOf(startString);
               indexEnd = text.IndexOf(endString);
               if (indexStart != -1 &amp;&amp; indexEnd != -1)
               {
                   matched.Add(text.Substring(indexStart + startString.Length,
                       indexEnd - indexStart - startString.Length));
                   text = text.Substring(indexEnd + endString.Length);
               }
               else
                   exit = true;
           }
           return matched;
       }</pre>

3 Ответов

Рейтинг:
21

#realJSOP

Ты переоцениваешь это.

string text = "TestTest - CustID : 1200005#14102016_0412- ARF";
string[] parts = text.Split(':');
string[] parts2 = parts[1].Split('#');
string result = parts2[0].Trim();


или даже

string text = "TestTest - CustID : 1200005#14102016_0412- ARF";
string result = text.Split(':')[1].Split('#')[0].Trim();


Если вам нужна какая-то ловушка ошибок, вам, вероятно, следует использовать 1-ю версию.


W∴ Balboos, GHB

очень милый (+)

Maciej Los

5ед!

Рейтинг:
2

Patrice T

Цитата:
Это работает

- Вы уверены ?
string subject = "TestTest - CustID : 1200005#14102016_0412- ARF"
if (subject.Trim().Contains("CustID"))
{
    if (subject.Trim().Contains(CustomerID:))
    {
        customerId = ExtractFromString(mailSubject, "CustomerID:","#");
    }
    else if (subject.Trim().Contains(CustID:))
    {
        customerId = ExtractFromString(mailSubject, "CustomerID:","#");
    }
}

Я вижу 2 синтаксические ошибки, 3 Неправильное использование и 4 ошибки логики.
И из кода я подозреваю, что пример не является полным.
Я ожидаю 2 основных примера с необязательными пробелами.

у меня щиплет глаза.

Так в чем же вопрос и проблема ?

[обновление]
Когда я увижу твой новый код:
if (subject.Trim().Contains("CustID"))
    {
        customerId = ExtractFromString(mailSubject, "CustID:","#");
    }
    else if (subject.Trim().Contains(CustID:))
    {
        customerId = ExtractFromString(mailSubject, "CustID:","#");
    }
}

Вы не понимаете, что делает этот код, он не может быть вашим, он даже не компилируется !
Совет: учитесь правильно с#


#realJSOP

Он искал что-то, что могло бы извлечь фактический идентификатор клиента независимо от включения/расположения пробелов в анализируемой строке. Смотрите мое решение.

Patrice T

Я знаю, но он также утверждает, что код работает ! :)

Рейтинг:
0

Maciej Los

Решение 1 по Джон Симмонс / программист-преступник[^] очень хорошо. В качестве альтернативы вы можете использовать Класс регулярных выражений[^], который используется для поиска совпадающей строки.

Я бы предложил использовать Регулярное выражение.Матч[^] метод:

string subject = "TestTest - CustID : 1200005#14102016_0412- ARF";
string pattern = @"\d{1,}#";

Match m = Regex.Match(subject, pattern, RegexOptions.Singleline);
if(m.Success)
	Console.WriteLine(m.Value.Replace("#",""));


Примечание: измените шаблон в соответствии с вашими потребностями.

Для получения более подробной информации, пожалуйста, смотрите:
Язык Регулярных Выражений-Краткий Справочник[^]