Использование Regex для поиска значений в файле - PullRequest
2 голосов
/ 18 февраля 2011

Я, на самом деле, не ищу справку по синтаксису, но подхожу к совету. Вот что мне нужно сделать:

Мне нужно прочитать какой-нибудь текст из файла, содержащего ходы (это часть проекта игры в шахматы), а затем распечатать, какой ход был выполнен. Вот пример текста, который я использую для текстового файла:

РЕДАКТИРОВАТЬ: чтобы уточнить, каждый из них представляет движение. то есть RlA1 означает, что белая комната перемещена в A1, NlB1 означает, что белый рыцарь - в B1 и т. д.

RlA1 NlB1 BlC1 QlD1 KlE1 BlF1 NlG1 RlH1
PlA2 PlB2 PlC2 PlD2 PlE2 PlF2 PlG2 PlH2
RdA8 NdB8 BdC8 QdD8 KdE8 BdF8 NdG8 RdH8
PdA7 PdB7 PdC7 PdD7 PdE7 PdF7 PdG7 PdH7
B1 C3* B2 B3 D8 H4

и вот что должно быть выведено для этого примера ввода:

A white rook is placed on A1 and a white knight is placed on B1 ... etc 
A white pawn ... etc 
A black rook ... etc 
A black pawn ... etc 
The piece on B1 moves to C3 and captures the piece there and the piece on B2 moves to B3 and the piece on D8 moves to H4

Очевидно, что я буду использовать переопределение метода toString (), чтобы напечатать ходы назад, но мне нужно знать, как мне нужно проанализировать ввод с помощью RegEx, чтобы определить, что представляет собой каждый ход.

Опять же, не очень нужна синтаксическая помощь, а скорее совет о том, как мне подходить к проблеме (Псевдо)

Я делаю это на Java.

Ответы [ 3 ]

1 голос
/ 18 февраля 2011

Во-первых, вы просто хотите разделить строку на отдельные движения. Сделайте это с помощью функции split вашего языка.

После этого вы можете анализировать отдельные движения. Обратите внимание, что шахматные ходы могут быть довольно сложными в стандартных обозначениях, поэтому я бы посоветовал не пытаться объединить все это в одно регулярное выражение. Скорее создайте вспомогательную функцию, такую ​​как is_capture, is_castle, is_en_passant, get_moving_piece и т. Д.

0 голосов
/ 18 февраля 2011

Поскольку вы пишете проект «Шахматная игра», я предлагаю отформатировать файл ходов для более простого анализа. Поместите все части размещения в одну строку. На следующей строке поместите ходы с запятой, разделяющей каждый ход, примерно так: B1 C3 *, B2 B3, D8 H4 и т. Д.

Когда вы читаете в файле, прочитайте в первой строке и разделите его на пробелы. Отправьте каждый из полученных элементов массива в функцию, которая анализирует размещение фрагмента.

Прочитайте в следующей строке и разделите его на запятую. Отправьте каждый из полученных элементов массива в функцию, которая анализирует ходы. Каждый элемент будет содержать начальное и конечное место фрагмента, так что вам не нужно делать столько сумасшедшего анализа.

0 голосов
/ 18 февраля 2011

Это зависит от языка. Если это скомпилированный язык, я бы сделал так, как предложил Тим, split () и разбирал по одной букве за раз.

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

...