Kei*_*las 19 .net c# datetime-format datetime-parsing
给定日期时间格式字符串,是否有标准方法来查找匹配该格式的第一个匹配子字符串?
例如,给定......
d-MMM-yy H:mm:ss
和一些文字......
"blah 1 2 3 7-Jul-13 6:15:00 4 5 6 blah"
我希望它会回归
"7-Jul-13 6:15:00"
现在我可以通过解析找到这个字符串,但我想知道是否有任何库支持这样做?
这可能不是最有效的,但它似乎是一个有趣的问题,所以我想我会尝试这种方法.
它采用你的DateTime格式字符串,并通过用.
和替换任何字母来制作正则表达式字符串模式\\s
.然后它从该模式中创建一个Regex对象,并尝试在输入句子中找到第一个匹配项.
该匹配(如果存在)将被传递到DateTime.TryParseExact
呼叫中.我确信可以进行改进,但这可能有助于对不需要对正则表达式进行硬编码或输入句子格式的技术提出一般性建议.
string inputSentence = "blah 1 2 3 7-Jul-13 6:15:00 4 5 6 blah";
string dtformat = "d-MMM-yy H:mm:ss";
//convert dtformat into regex pattern
StringBuilder sb = new StringBuilder();
foreach (char c in dtformat)
{
if (Char.IsLetter(c))
{
if (char.ToUpperInvariant(c) == 'D' || char.ToUpperInvariant(c) == 'H' || char.ToUpperInvariant(c) == 'S')
sb.Append(".{1,2}");
else
sb.Append(".");
}
else if(Char.IsWhiteSpace(c))
sb.Append("\\s");
else
sb.Append(c);
}
string dtPattern = sb.ToString();
Regex dtrx = new Regex(dtPattern);
//get the match using the regex pattern
var dtMatch = dtrx.Match(inputSentence);
if(dtMatch != null)
{
string firstString = dtMatch.Value.Trim();
//try and parse the datetime from the string
DateTime firstMatch;
if (DateTime.TryParseExact(dstr, dtformat, null, DateTimeStyles.None, out firstMatch))
{
Console.WriteLine("Parsed");
}
else
{
Console.WriteLine("Could not parse");
}
}
Run Code Online (Sandbox Code Playgroud)
也许是这样的:
通过解析文本中的每个单词来查找格式字符串的每个部分,并将2结合起来创建DateTime
string test = "blah 1 2 3 7-Jul-13 6:15:00 4 5 6 blah";
int formatPart = 0;
bool dateFound = false;
string format = "d-MMM-yy H:mm:ss";
DateTime myDateTime = DateTime.MinValue;
foreach (var item in test.Split(' '))
{
DateTime dummy;
if (DateTime.TryParseExact(item, format.Split(' ')[formatPart], null, DateTimeStyles.NoCurrentDateDefault, out dummy))
{
if (myDateTime == DateTime.MinValue)
{
formatPart++;
myDateTime = dummy;
dateFound = myDateTime.Date != DateTime.MinValue.Date;
continue;
}
// If date was found first, add time, else add date
myDateTime = dateFound
? myDateTime.Add(new TimeSpan(dummy.Hour, dummy.Minute, dummy.Second))
: dummy.Add(new TimeSpan(myDateTime.Hour, myDateTime.Minute, myDateTime.Second));
break;
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
Input: "blah 1 2 3 7-Jul-13 6:15:00 4 5 6 blah"
Format: "d-MMM-yy H:mm:ss"
Input: "blah 1 2 3 6:15:00 7-Jul-13 4 5 6 blah"
Format: "H:mm:ss d-MMM-yy"
Input: "blah 1 2 3 6:15:00 7-7-2013 4 5 6 blah"
Format: "H:mm:ss d-M-yyyy"
Input: "blah 1 2 3 07-07-2013 6:15:00 4 5 6 blah"
Format: "dd-MM-yyyy H:mm:ss"
Run Code Online (Sandbox Code Playgroud)
除了 DateTime.TryParse (或者 RegEx)之外,我不知道还有什么可以在 .NET 中执行此操作。
我将设置一个流标记生成器,仅将候选标记对传递到 DateTime.TryParse (基于最小字符串长度的某种组合,可能的子字符串检查标记 0 上的一对破折号和标记 1 上的一对冒号等。确切的检查取决于您支持的日期/时间格式的数量)
归档时间: |
|
查看次数: |
1759 次 |
最近记录: |