【问题标题】:Regex match word followed by decimal from text正则表达式匹配单词,后跟文本中的小数
【发布时间】:2015-11-18 17:32:06
【问题描述】:

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

给定文本:

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

【问题讨论】:

  • 十进制数是否总是有小数点,并且小数点后正好有2个数字,否则它会如何变化?如果确实出现了不符合该模式的数字,您是要包括它们还是排除它们?

标签: c# regex


【解决方案1】:

您没有将-[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# sn-p:

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{L}的字符类中添加\p{M}

[\p{L}\p{M}-]+\p{Zs}*\d*\.?\d{1,2}(?:\p{Zs}*[\p{L}\p{M}-]+)?\b

【讨论】:

  • 如果您有任何疑问,请随时发表评论。请注意,如果您只需要允许 ASCII 字母,请使用您的 [a-zA-Z] 字符类而不是 \p{L}
  • 我只得到一个匹配,第一个仍然。我希望得到一个字符串数组
  • 行得通。完美的。谢谢你。将在 5 分钟内接受
  • 我想你可能会建议 \p{L}\p{M}*+ 而不是仅仅 \p{L} 允许 Unicode 变音符号是单独的代码点而不与前面的字母组合。 Source.
  • @ErikE:不,但它支持原子组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多