RegEx: заменить новой строкой подстроку соответствующего токена / подстроки - PullRequest
0 голосов
/ 08 апреля 2020

Мне нужно проверить следующие совпадения в строке:

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

, но заменить при совпадении этих токенов только подстроки

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

другим текстом, оставляя пробелы .

Каждая строка должна рассматриваться как отдельная входная строка.

Подробно, мне нужно:

  • заменить на "SINSC" подстроки "SIN" и "SX" внутри токенов "SIN ", " SIN", " SIN ", "SX ", " SX", " SX " каждый раз, когда сопоставляется один из них

  • заменять на "RICOM" подстроку "RIC" внутри токенов "RIC ", " RIC", " RIC " каждый раз, когда один из них совпадают

  • (совпадения для "OK ", " OK", " 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 некоторые строки подсвечены синий после конца строки, а остальные нет?

Спасибо!

1 Ответ

0 голосов
/ 08 апреля 2020

О коде замены regex вы можете найти больше информации о том, как это делается в этой статье, из . NET документации https://docs.microsoft.com/en-us/dotnet/standard/base-types/substitutions-in-regular-expressions.

С указанным вами регулярным выражением я напишу что-то вроде этого:

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;
    }
});

Этот код проверяет, что было захвачено второй группой вашего регулярного выражения, и заменяет его соответствующим значением.

По вашему второму вопросу строки, выделенные синим цветом, на самом деле являются строками, полученными из первой группы вашего регулярного выражения.

...