Почему границы не работают в скобках регулярных выражений? - PullRequest
0 голосов
/ 23 мая 2019

Для начала хотелось бы отметить, что аналогичный вопрос существует с ответами и обходными путями, специфичными для PHP.Я вижу эту проблему в C #, и я хотел бы понять логику этой очевидной «ошибки».

Символ границы слова \b, кажется, не работает должным образом, когда помещается в набор Regex(он же «квадратные скобки»: []).Это синтаксическая проблема, преднамеренно ли исключены границы слов из сопоставления множеств или есть какое-то другое объяснение, которое я пропускаю?

Вот программа, демонстрирующая проблему:

namespace TestProgram
{
    using System.Text.RegularExpressions;
    using System.Diagnostics;
    class Program
    {
        static void Main(string[] args)
        {
            var text = "[abc]";
            var BaselineRegex = new Regex(@"(?:\b)(abc)");
            Debug.Assert(BaselineRegex.IsMatch(text)); // Assertion Passes
            var BracketRegex = new Regex(@"(?:[\b])(abc)");
            Debug.Assert(BracketRegex.IsMatch(text)); // Assertion Fails!
        }
    }
}

Вот веб-версии для демонстрации:

  • Граница слова, выполняемая, как и ожидалось, без скобок: ( ссылка )

  • Граница слова, не совпадающая при нахождении в скобках: ( ссылка )

1 Ответ

0 голосов
/ 23 мая 2019

Цитировать Комментарий Wiktor Stribiżew :

[\b] является шаблоном сопоставления символов возврата, и это все.

Итак, пока \b - это граница слова нулевой ширины вне класса символов, она относится к символу возврата (0x8 в ASCII) при использовании в классе символов.Более подробная информация представлена ​​в этом сообщении .

Wiktor: Если вы хотите опубликовать свой собственный ответ, я был бы рад принять его поверх этого.

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