.NET Regex для разбора шахматных ходов - PullRequest
0 голосов
/ 02 ноября 2019

Фон

Я хотел бы проанализировать довольно много строк, представляющих шахматные ходы:

1.e4e62.d3d53.Nd2c54.g3Nf6

Каждый ход начинается с возрастающего числа 1.,2., 3. и т. Д. Между ходами нет пробелов.

Идеальным совпадением будет такой массив:

["1.e4e6", "2.d3d5", "3.Nd2c5", "4.g3Nf6"]

Regex Question

Мое регулярное выражение до сих пор:

([0-9]\.)(.*?)(?=[0-9]\.)

Это работает в онлайн .NET Regex Tester (Regex Storm), за исключением последнего хода (4-й). Как включить последний тоже?

C # Вопрос

Мой код:

var regex = new Regex(@"([0-9]\.)(.*?)(?=[0-9]\.)");
var match = regex.Match(game);

Совпадение здесь включает только одну запись "1.e4e6 ", а не три (или четыре). Как исправить?

Спасибо, пом

1 Ответ

0 голосов
/ 02 ноября 2019

Он не может соответствовать последнему элементу, потому что утверждение предпросмотра неверно, так как после него нет цифр и точек.

Вы можете добавить совпадение к концу строки, используя чередование.

Чтобы получить все результаты, вы можете использовать Совпадения .

([0-9]\.)(.*?)(?=[0-9]\.|$)

Regex demo | C # demo

Например

string pattern = @"([0-9]\.)(.*?)(?=[0-9]\.|$)";
string input = @"1.e4e62.d3d53.Nd2c54.g3Nf6";

foreach (Match m in Regex.Matches(input, pattern))
{
    Console.WriteLine(m.Value);
}

Обратите внимание, что если вы хотите получить только совпадение и не хотите совпадать с пробелами, вы можете использовать \Sвместо . и пропустите группу захвата:

[0-9]\.\S*?(?=[0-9]\.|$)

Regex demo

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