簡體   English   中英

C#如何從字符串中提取單詞並將其放入類成員

[英]C# How to extract words from a string and put them into class members

我在處理C#字符串時遇到問題,非常感謝您的幫助。 我有一個包含很多行的文件。 看起來像這樣:

firstWord   number(secondWord)    thirdWord(Phrase)  Date1  Date2
firstWord number(secondWord)         thirdWord(Phrase)   Date1     Time1
...

我需要將這些單詞分開並將它們放在類屬性中。 如您所見,問題在於單詞之間的間隔不相同,有時是一個間隔,有時是八個間隔。 第二個問題是,在第三位出現的詞組包含2到5個單詞(再次由空格分隔,有時有時與_或-沖突),並且必須將其視為一個字符串-它必須是一個類成員。 該類應如下所示:

class A
string a = firstWord;
int b = number;
string c = phrase;
Date d = Date1;
Time e = Time1;

如果您有任何解決方法的想法,我們將不勝感激。 謝謝。

使用以下步驟:

  1. 使用File.ReadAllLines()獲得string[] ,其中每個元素代表文件的一行。
  2. 對於每一行,使用string.Split()並將您的行切成單個單詞。 使用空格和括號作為分隔符。 這將為您提供一系列單詞。 稱之為arr
  3. 現在創建您的類的對象並按以下方式分配:

     string a = arr[0]; int b = int.Parse(arr[1]); string c = string.Join(" ", arr.Skip(4).Take(arr.Length - 6)); Date d = DateTime.Parse(arr[arr.Length - 2]); Date e = DateTime.Parse(arr[arr.Length - 1]); 

唯一棘手的是上面的string c 這里的邏輯是從元素號開始。 從第4個元素到最后第3個元素,所有這些元素都構成了您的短語部分,因此我們使用linq提取這些元素並將它們結合在一起以獲取您的短語。 顯然,這要求該短語本身不包含任何括號,但是我通常不應該這樣。

您需要一個循環和string -和TryParse方法:

var list = new List<ClassName>();
foreach (string line in File.ReadLines(path).Where(l => !string.IsNullOrEmpty(l)))
{
    string[] fields = line.Trim().Split(new char[] { }, StringSplitOptions.RemoveEmptyEntries);
    if (fields.Length < 5) continue;

    var obj = new ClassName();
    list.Add(obj);

    obj.FirstWord = fields[0];

    int number;
    int index = fields[1].IndexOf('(');
    if (index > 0 && int.TryParse(fields[1].Remove(index), out number))
        obj.Number = number;

    int phraseStartIndex = fields[2].IndexOf('(');
    int phraseEndIndex = fields[2].LastIndexOf(')');
    if (phraseStartIndex != phraseEndIndex)
    {
        obj.Phrase = fields[2].Substring(++phraseStartIndex, phraseEndIndex - phraseStartIndex);
    }

    DateTime dt1;
    if(DateTime.TryParse(fields[3], out dt1))
        obj.Date1 = dt1;

    DateTime dt2;
    if (DateTime.TryParse(fields[3], out dt2))
        obj.Date2 = dt2;
}

以下正則表達式似乎可以滿足您的需求,至少是一個好的開始。

^(?<firstWord>[\w\s]*)\s+(?<secondWord>\d+)\s+(?<thirdWord>[\w\s_-]+)\s+(?<date>\d{4}-\d{2}-\d{2})\s+(?<time>\d{2}:\d{2}:\d{2})$

這捕獲了5個命名組

  • firstWord是任何字母數字或空格
  • secondWord是任何數字輸入
  • thirdWord任何字母數字,下划線或連字符
  • date是任何iso格式的日期(日期未經驗證)
  • time的任何時間(時間不進行驗證)

任意數量的空格都用作分隔符-但您必須對所有組捕獲都使用Trim() 這讓很多關於您的格式假設的地獄 (日期格式ISO,時間是HH:MM:SS)。

您可以這樣使用它:

Regex regex = new Regex( @"(?<firstWord>[\w\s]*)\s+(?<secondWord>\d+)\s+(?<thirdWord>[\w\s_-]+)\s+(?<date>\d{4}-\d{2}-\d{2})\s+(?<time>\d{2}:\d{2}:\d{2})$", RegexOptions.IgnoreCase );
var match = regex.Match("this is the first word        123     hello_world    2017-01-01 10:00:00");
if(match.Success){
    Console.WriteLine("{0}\r\n{1}\r\n{2}\r\n{3}\r\n{4}",match.Groups["firstWord"].Value.Trim(),match.Groups["secondWord"].Value,match.Groups["thirdWord"].Value,match.Groups["date"].Value,match.Groups["time"].Value);
}

http://rextester.com/LGM52187

你必須使用正則表達式,你可以看看這里為起點。 因此例如要獲取第一個單詞,您可以使用此單詞

string data = "Example 2323 Second     This is a Phrase  2017-01-01 2019-01-03";
string firstword = new Regex(@"\b[A-Za-z]+\b").Matches(data )[0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM