如果我有一个包含格式的字符串,例如下方(请注意,我无法更改此字符串格式)
var str = "FormatedDate:Printed {0:dd MMM yyyy HH:mm:ss}"
我只需要提取格式,例如
"dd MMM yyyy HH:mm:ss"
我知道我可以使用字符串操作或正则表达式来做到这一点,但是有没有一种使用string
/ format
等的.Net方法。而不是将给定的字符串插入格式中,我需要提取该格式。
非常感谢
答案 0 :(得分:2)
使用正则表达式
string str = "FormatedDate:Printed {0:dd MMM yyyy HH:mm:ss}";
string pattern = @"{\d+:(?'date'[^}]+)";
Match match = Regex.Match(str, pattern);
string date = match.Groups["date"].Value;
没有正则表达式
string str = "FormatedDate:Printed {0:dd MMM yyyy HH:mm:ss}";
string[] splitData = str.Split(new char[] { '{' });
string date = splitData[1].Substring(splitData[1].IndexOf(":") + 1);
date = date.Replace("}", "");
在大括号和大括号之间进行拆分可节省一行代码
string str = "FormatedDate:Printed {0:dd MMM yyyy HH:mm:ss}";
string[] splitData = str.Split(new char[] { '{', '}' });
string date = splitData[1].Substring(splitData[1].IndexOf(":") + 1);
答案 1 :(得分:1)
您可以通过使用string.Format()
传入您专门编写的IFormattable
对象的列表来提取使用的所有格式的列表,以记录使用的格式。
/// <summary>
/// A detected argument in a format string
/// </summary>
public class DetectedFormat
{
public DetectedFormat(int position, string format)
{
Position = position;
Format = format;
}
public int Position { get; set; }
public string Format { get; set; }
}
/// <summary>
/// Implements IFormattable. Used to collect format placeholders
/// </summary>
public class FormatDetector: IFormattable
{
private int _position;
List<DetectedFormat> _list;
public FormatDetector(int position, List<DetectedFormat> list)
{
_position = position;
_list = list;
}
public string ToString(string format, IFormatProvider formatProvider)
{
DetectedFormat detectedFormat = new DetectedFormat(_position, format);
_list.Add(detectedFormat);
// Return the placeholder without the format
return "{" + _position + "}";
}
}
示例代码
// Max index of arguments to support
int maxIndex = 20;
string f = "Text {1:-3} with {0} some {2:0.###} format {0:dd MMM yyyy HH:mm:ss} data";
// Empty list to collect the detected formats
List<DetectedFormat> detectedFormats = new List<DetectedFormat>();
// Create list of fake arguments
FormatDetector[] argumentDetectors = (from i in Enumerable.Range(0, maxIndex + 1)
select new FormatDetector(i, detectedFormats)).ToArray();
// Use string.format with fake arguments to collect the formats
string strippedFormat = string.Format(f, argumentDetectors);
// Output format string without the formats
Console.WriteLine(strippedFormat);
// output info on the formats used
foreach(var detectedFormat in detectedFormats)
{
Console.WriteLine(detectedFormat.Position + " - " + detectedFormat.Format);
}
输出:
Text {1} with {0} some {2} format {0} data 1 - -3 0 - 2 - 0.### 0 - dd MMM yyyy HH:mm:ss