首页 > 解决方案 > 正则表达式:用新字符串替换匹配的标记/子字符串的子字符串

问题描述

我需要检查字符串中的以下匹配项:

"SIN ", " SIN", " SIN ", "SX ", " SX", " SX ", "RIC ", " RIC", " RIC ", "OK ", " OK", " OK "

但是替换,当这些标记匹配时,只有子字符串

"SIN", "SX", "RIC", "OK"

与另一个文本,保持空格。

每一行都必须被视为不同的输入字符串。

详细地说,我需要:

我为第一次过滤编写了以下表达式:

(^|\s+)(SIN|SX|RIC|OK)(\s+|$)

它似乎有效(我已经考虑过前后多个空格的情况)。我在以下文本中尝试过:

(您可以在以下位置查看演示:https ://regex101.com/r/vIZCGW/2 )

16M2 - SIN - 49.000 KM - SENS - A/C - n.d. - FROM:   - MATRIC.: n.d. - GEAR: n.d. - COD.PROD.RIC.: n.d. - NR.PLATE: 
14I2 - OK - 20.000 KM - A/C - n.d. - FROM: - MATRIC.: n.d. - GEAR: n.d. - COD.PROD.RIC.: n.d. - NR.PLATE: 
11A0 - SIN - 55.000 KM - SQUARE - SENS - A/C
16H0 - n.d. - n.d. - FROM:   - MATRIC.: n.d. - GEAR: n.d._n.d. marce - COD.PROD.RIC.: n.d. - NR.PLATE: 
14N1 - SIN - n.d. - FROM:   - MATRIC.: n.d. - GEAR: n.d._n.d. marce - COD.PROD.RIC.: n.d. - NR.PLATE:  - STEEL
16D2 - SIN - n.d. - FROM:   - MATRIC.: n.d. - GEAR: n.d._n.d. marce - COD.PROD.RIC.: n.d. - NR.PLATE: 
SX 100000 KM        15K2
SIN - 15D1
16P0 - OK - n.d. - FROM:   - MATRIC.: n.d. - GEAR: n.d._n.d. marce - COD.PROD.RIC.: n.d. - NR.PLATE: 
16H0 - SIN - n.d. - FROM:   - MATRIC.: n.d. - GEAR: n.d._n.d. marce - COD.PROD.RIC.: n.d. - NR.PLATE: 
16I1    SIN
14K1 - SIN - n.d. - FROM:   - MATRIC.: n.d. - GEAR: n.d._n.d. marce - COD.PROD.RIC.: n.d. - NR.PLATE: 
SX    14E2
SX     16D1 NO TURBO
SX 110000 KM          15M1
16O2 - SIN 
15J1 - SIN
16L1   SIN DAMAGED
16P2 - SIN - DAMAGED
SX          15E2
SX        9D2
SIN - 130.000 KM - 16J1
OK          13A0
SX        16M0
OK        11A1
OK        12V1
SX 105CV        15P1
OK 105CV        15O2
14A2 - SIN

我的问题基本上是2:

  1. 正则表达式替换代码如何?

  2. 为什么在https://regex101.com/r/vIZCGW/2的演示中,有些行在行尾后以浅蓝色突出显示,而其他行则没有?

谢谢!

标签: c#regexregular-language

解决方案


关于正则表达式替换代码,您可以从.NET 文档 https://docs.microsoft.com/en-us/dotnet/standard/base-types/substitutions-in-regular中找到有关如何在本文中完成的更多信息-表达式

使用您提供的正则表达式,我会写如下内容:

Regex regex = new Regex(@"(^|\s+)(SIN|SX|RIC|OK)(\s+|$)");

string result = regex.Replace(input, m =>
{
    switch (m.Groups[2].Value)
    {
        case "SX":
        case "SIN":
            return "SINSC";
        case "RIC":
            return "RICOM";
        default:
            return m.Value;
    }
});

这段代码的作用是检查第二组正则表达式捕获的内容,并将其替换为相应的值。

关于您的第二个问题,以蓝色突出显示的行实际上是从您的正则表达式的第一组中捕获的行。


推荐阅读