如何编写 C# 正则表达式模式以匹配基本的 printf 格式字符串,如“%5.2f”?

Posted

技术标签:

【中文标题】如何编写 C# 正则表达式模式以匹配基本的 printf 格式字符串,如“%5.2f”?【英文标题】:How to write C# regular expression pattern to match basic printf format-strings like "%5.2f"? 【发布时间】:2010-11-04 15:54:17 【问题描述】:

它应该符合以下条件(条件部分在方括号中:

%[some numbers][.some numbers]d|f|s

符号 d|f|s 表示其中一个必须存在。

谢谢和BR-马蒂

【问题讨论】:

【参考方案1】:

应该这样做:

string input = "Bloke %s drank %5.2f litres of water and ate %d bananas";
string pattern = @"%(\d+(\.\d+)?)?(d|f|s)";

foreach (Match m in Regex.Matches(input, pattern))

    Console.WriteLine(m.Value);

我没有在我的模式中使用[dfs],因为我计划更新它以使用命名组。这是基于 your earlier question 关于找出 C 样式格式字符串的替换策略的。

这是一个想法:

string input = "Bloke %s drank %5.2f litres of water and ate %d bananas";
string pattern = @"%(?<Number>\d+(\.\d+)?)?(?<Type>d|f|s)";

int count = 0;
string result = Regex.Replace(input, pattern, m =>

    var number = m.Groups["Number"].Value;
    var type = m.Groups["Type"].Value;
    // now you can have custom logic to check the type appropriately
    // check the types, format with the count for the current parameter
    return String.Concat("", count++, "");
);

C#/.NET 2.0 方法:

private int formatCount  get; set; 

void Main()

    string input = "Bloke %s drank %5.2f litres of water and ate %d bananas";
    Console.WriteLine(FormatCStyleStrings(input));  


private string FormatCStyleStrings(string input)

    formatCount = 0; // reset count
    string pattern = @"%(?<Number>\d+(\.\d+)?)?(?<Type>d|f|s)";
    string result = Regex.Replace(input, pattern, FormatReplacement);
    return result;


private string FormatReplacement(Match m)

    string number = m.Groups["Number"].Value;
    string type = m.Groups["Type"].Value;
    // custom logic here, format as needed
    return String.Concat("", formatCount++, "");

【讨论】:

匹配“%%d”,尽管它可能不应该匹配(虽然很难从问题中分辨出来) 当括号中的字符类可以工作时对单个字符使用交替是不必要的浪费。 @tchrist:你的角色等级很好,同意。我这样做是有原因的,仍在编辑过程中... @user470379:嗯无法重现...使用%%d bananas。你有例子吗? 非常感谢。这是我之前问题的答案!因为我不熟悉正则表达式,所以我必须真正深入研究它。还必须将其转换为 C#2.0,这不是什么大问题;)【参考方案2】:
%(?:\d+)?(?:\.\d+)?[dfs]

是您问题的答案,但我怀疑您可能问错了问题,printf 承认的不止这些。

【讨论】:

非常感谢!我知道,但我只能替换有限的一组字符串。【参考方案3】:

这是一个匹配 printf/scanf 函数格式字符串的所有字段的表达式。

(?<!%)(?:%%)*%([\-\+0\ \#])?(\d+|\*)?(\.\*|\.\d+)?([hLIw]|l1,2|I32|I64)?([cCdiouxXeEfgGaAnpsSZ])

它基于Format Fields Specification。根据此规范,%[flags][width][.precision][h|l|ll|L|I|I32|I64|w]type 匹配组将包含:#1 - flags, #2 - width, #3 - precision, #4 - size prefix, #5 - type.

取自here。

【讨论】:

以上是关于如何编写 C# 正则表达式模式以匹配基本的 printf 格式字符串,如“%5.2f”?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写正则表达式模式来获取匹配的字符串?

如何在 Pl/SQL 中编写正则表达式匹配模式?

C# 正则表达式将不匹配

正则表达式 - 匹配规则

仅当字符串的一部分前面没有某些字符时,如何匹配它?

正则和grep——再做正则就去死