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