正则表达式匹配单词后跟文本的十进制

时间:2015-11-18 17:32:07

标签: c# regex

我希望能够匹配以下示例并返回匹配数组

给出文字:

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

1 个答案:

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