如何编写 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”?的主要内容,如果未能解决你的问题,请参考以下文章