[英]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;
如果您有任何解決方法的想法,我們將不勝感激。 謝謝。
使用以下步驟:
File.ReadAllLines()
獲得string[]
,其中每個元素代表文件的一行。 string.Split()
並將您的行切成單個單詞。 使用空格和括號作為分隔符。 這將為您提供一系列單詞。 稱之為arr
。 現在創建您的類的對象並按以下方式分配:
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);
}
你必須使用正則表達式,你可以看看這里為起點。 因此例如要獲取第一個單詞,您可以使用此單詞
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.