Почему это регулярное выражение не соответствует пробелу? - PullRequest
2 голосов
/ 10 сентября 2009

У меня есть следующее регулярное выражение:

([0-9]+),'(.)':([0-9]+),(L|R|'.')

Это очень хорошо соответствует:

1,'a':1,R

Однако, если я заменю a пробелом, произойдет сбой:

1,' ':1,R

Почему . не соответствует? Разве пространство не классифицируется как символ? Я не могу использовать \ s , потому что я не хочу сопоставлять табуляцию и разрывы строк. Я также попробовал:

([0-9]+),'(.| )':([0-9]+),(L|R|'.')

Но это тоже не работает (и у меня не включена IgnorePatternWhitespace).

Ответы [ 3 ]

1 голос
/ 10 сентября 2009

Я не могу воспроизвести то, что вы видите:

using System;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        Regex regex = new Regex("([0-9]+),'(.)':([0-9]+),(L|R|'.')");
        Console.WriteLine(regex.IsMatch("1,' ':1,R"));
    }
}

печатает "True".

Возможно ли, что в кавычках есть еще один символ? Какой-нибудь непечатный персонаж? Откуда приходит текст?

Вы можете попробовать изменить его на:

([0-9]+),'([^']+)':([0-9]+),(L|R|'.')

, чтобы между кавычками могло совпадать более одного символа.

0 голосов
/ 10 сентября 2009

Используйте \ 0x0020 , который будет соответствовать одному пробелу.

0 голосов
/ 10 сентября 2009

Я не пробовал в .NET, но точка зависит от языка и реализации. Попробуйте:

([0-9]+),'([.| ])':([0-9]+),(L|R|'.')
...