Regex在另外两个关键字之间抓取并重写字符串

本文关键字:之间 关键字 抓取 字符串 重写 两个 Regex | 更新日期: 2023-09-27 18:20:51

我在重写字符串中两个"关键字"之间的字符串时遇到了一些问题。以下是有问题的正则表达式模式:

modify = Regex.Replace(modify, "FEW([0-9]{3})", "few clouds at $1.");
modify = Regex.Replace(modify, @"(?s)(?<=[0-9]{2}SM).+0([0-9]{1})0.+?(?=[0-9]{2}/[0-9]{2})", "$2 thousand");

基本上,我需要在METAR中获得云层,特别是"FEW070"

KLAX 032109Z 26014KT 10SM FEW070 SCT120 BKN220 21/17 A2986 RMK AO2

我希望它在7000时返回几朵云,但它在070时返回几朵云。

我一直在使用这个程序来测试regex表达式,使用上面的模式,它会像应该的那样返回7。

Regex在另外两个关键字之间抓取并重写字符串

试试这个:

modify = Regex.Replace(modify, @"FEW0*('d+)0", "few clouds at $1,000.");

一个更简单的正则表达式可能会更好,但以下是您的问题:

  • (?s)(?<=...)都不是捕获组,因此必须使用$1而不是$2才能获得7
  • 将字符串替换为"few clouds at 070",但之后就不会再调用"few clouds at "部分了。您应该将.+放在括号中,并使用$1$2而不是$1
  • 您可能应该使用.+?而不是.+

最终代码:

modify = Regex.Replace(modify, "FEW([0-9]{3})", "few clouds at $1");
modify = Regex.Replace(modify, @"(?s)(?<=[0-9]{2}SM)(.+?)0([0-9]{1})0.+?(?=[0-9]{2}/[0-9]{2})", "$1$2 thousand.");

测试。