c#如何仅从包含格式的字符串中提取格式(例如string =“ Printed on {0:dd MMM yyyy}”,而我想要dd MMM yyyy

时间:2019-12-12 15:21:46

标签: c# .net string datetime format

如果我有一个包含格式的字符串,例如下方(请注意,我无法更改此字符串格式)

var str = "FormatedDate:Printed {0:dd MMM yyyy HH:mm:ss}"

我只需要提取格式,例如

"dd MMM yyyy HH:mm:ss"

我知道我可以使用字符串操作或正则表达式来做到这一点,但是有没有一种使用string / format等的.Net方法。而不是将给定的字符串插入格式中,我需要提取该格式。

非常感谢

2 个答案:

答案 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