Класс отрицательных символов: что соответствует [^ s \ W]?(Это часть целого выражения) - PullRequest
0 голосов
/ 31 января 2019

Regex Flavor

Я использую regex-аромат C # / .NET Framework.

Что соответствует [^ s \ W]?

Я пытаюсьдля проверки совпадений, заявленных в регулярно-экспрессия.info / lookaround учебник.В частности, в разделе Важные замечания о Lookbehind было заявлено, что:

\b\w+(?<!s)\b эквивалентно \b\w*[^s\W]\b

Строка теста / источника для рассмотрения: John's

Оба регулярных выражения совпадают John.Но я ожидал, что второе регулярное выражение, \b\w*[^s\W]\b, потерпит неудачу (не совпадает ни с чем из тестовой строки) из-за [^s\W], не совпадающего ни с чем.Пройдя через то, что считает двигатель:

Двигатель регулярного выражения соответствует \b пустоте, предшествующей J и J, но двигатель остается на J.Движок регулярных выражений перемещается к следующему токену регулярных выражений \w* и потребляет John, останавливаясь на несловесном символе ' (апостроф).Теперь он пытается сопоставить апостроф с [^s\W] и в случае успеха потребляет его.Но это не помогает по причинам, которые я не понимаю (в противном случае апостроф был бы включен в матч).Таким образом, вся попытка сопоставления с регулярным выражением должна была закончиться неудачей, и двигатель должен был вернуться назад на \b.Но вместо этого двигатель соответствовал John, оставляя апостроф.[^s\W] должен был соответствовать чему-либо для возврата John.

[^s\W] - это набор всех символов, которых нет в наборе [s\W].Таким образом, это исключает s.\W - это набор всех несловарных символов, включая апостроф.Таким образом, [^s\W] исключает апостроф (то есть, это не заставило бы двигатель соответствовать и потреблять апостроф).

Пример решения

using System.Text.RegularExpressions;

namespace RegexExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Regex expr = new Regex("\\b\\w*[^s\\W]\\b");
            string source = "John's";

            bool hasMatch = expr.IsMatch(source);
            Console.WriteLine($"Any matches? {hasMatch}");

            if (hasMatch)
            {
                Match theMatch = expr.Match(source);
                Console.WriteLine("Matched: {0}", source.Substring(theMatch.Index, theMatch.Length));
            }

            Console.ReadLine();
        }
    }
}

Выход

Any matches? True
Matched: John

Ответы [ 2 ]

0 голосов
/ 31 января 2019
  • [] - для группы символов, которая соответствует любому из этих символов, указанных в скобках.
  • ^ в группе символов отрицает совпадение
  • \W соответствует чему-либоэто не так (слово, цифры и пробел);это обратное значение \w, которое соответствует (слово, цифры и пробелы)
  • s соответствует буквально s здесь

Итак, \b\w*[^s\W]\b ищет ноль-в-многих (слово, цифры и пробел), которые не заканчиваются (s или нет (слово, цифры и пробел)) в пределах границы слова.

0 голосов
/ 31 января 2019

Для этого конкретного случая "[^s\W]" соответствует "n" (последняя буква перед "'").

Ваше описание того, что "[^s\W]" соответствует, является правильным, но вывод о том, что "\ w *" будет соответствовать жадному совпадениюне все символы.

"\ w *" говорит, что "любое количество букв" и "[^ s \ W]" не может совпадать "` ", тогда" \ w * "выбирает 3 буквы и"n "выбрано" [^ s \ W] ".

Если вы явно используете все буквы" Джона ", совпадение будет неудачным:

    Regex expr = new Regex("\\b\\w\\w\\w\\w[^s\\W]\\b");
...