Проблема с logicOR (регулярное выражение) не жадный - PullRequest
0 голосов
/ 04 апреля 2010

Это часть строки "21xy5". Я хочу вставить «*», окруженный пробелами между цифрой и буквой, буквой и цифрой, буквой и буквой. Я использую этот шаблон регулярных выражений "\ d [a-z] | [a-z] \ d | [a-z] [a-z]", чтобы найти индексы, в которые я собираюсь вставить строку "*". Проблема заключается в том, что когда регулярное выражение OR (|) в строке 21xy5 соответствует значению 21-x | x-y | y-5, когда первое условие 21-x выполнено успешно, второе x-y не проверяется, а третье успешно. Таким образом, у меня 21 * xy * 5 вместо 21 * x * y * 5. Если входная строка похожа на эту xy21, то x-y success, а затем у меня есть x * y21. Проблема в том, что логическое ИЛИ не жадное.

    Regex reg = new Regex(@"\d[a-z]|[a-z]\d|[a-z][a-z]" );
    MatchCollection matchC;
    matchC = reg.Matches(input);
    int ii = 1;
    foreach (Match element in matchC)
    {
        input = input.Insert(element.Index + ii, " * ");
        ii += 3;
    }
    return input;

1 Ответ

1 голос
/ 04 апреля 2010

Вы хотите посмотреть вокруг.

Regex reg = new Regex(@"(\d(?=[a-z])|[a-z](?=[a-z\d]))");

(заменить reg на $1 *)

Проблема вашего оригинального регулярного выражения не в жадности, но на самом деле он потребляет 2 символа. Это означает, что при сопоставлении 1x останется доступным только y5, поэтому механизм регулярных выражений не сможет увидеть xy. OTOH, упреждающий просмотр - это просто утверждение нулевой ширины, поэтому следующий символ не будет использован. например в то время как 1x вместе соответствует \d(?=[a-z]), будет потребляться только 1, поэтому доступно xy5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...