我希望能够匹配以下示例并返回匹配数组
给出文字:
some word
another 50.00
some-more 10.10 text
another word
匹配应该是(单词,后跟空格,然后是十进制数字(可选地后跟另一个单词):
another 50.00
some-more 10.10 text
到目前为止,我有以下内容:
string pat = @"\r\n[A-Za-z ]+\d+\.\d{1,2}([A-Za-z])?";
Regex r = new Regex(pat, RegexOptions.IgnoreCase);
Match m = r.Match(input);
但它只匹配第一项:another 50.00
答案 0 :(得分:4)
您没有使用-
考虑[A-Za-z ]
,并且仅在换行符后匹配某些文字。
您可以使用以下正则表达式:
[\p{L}-]+\p{Zs}*\d*\.?\d{1,2}(?:\p{Zs}*[\p{L}-]+)?
请参阅regex demo
[\p{L}-]+
匹配1个或多个字母和连字符,\p{Zs}*
匹配0个或更多水平空格符号,\d*\.?\d{1,2}
匹配小数部分中1到2位数的浮点数,以及(?:\p{Zs}*[\p{L}-]+)?
匹配数字后面的可选字词。
以下是基于Regex.Matches
method匹配所有匹配项的C#代码段:
var res = Regex.Matches(str, @"[\p{L}-]+\p{Zs}*\d*\.?\d{1,2}(?:\p{Zs}*[\p{L}-]+)?")
.Cast<Match>()
.Select(p => p.Value)
.ToList();
仅供参考:如果您需要匹配整个单词,您还可以使用单词边界\b
:
\b[\p{L}-]+\p{Zs}*\d*\.?\d{1,2}(?:\p{Zs}*[\p{L}-]+)?\b
还有另一个注意事项:如果您还需要匹配变音符号,则可以将\p{M}
添加到包含\p{L}
的字符类中:
[\p{L}\p{M}-]+\p{Zs}*\d*\.?\d{1,2}(?:\p{Zs}*[\p{L}\p{M}-]+)?\b