Situatie:
Java programma leest doormiddel van een regex een tekstfile in. Deze tekstfile bevat schaakzetten, dit gebeurd vaak in een vaste notatie namelijk PGN.
Een PGN file ziet er als volgt uit:
Zoals je misschien meteen zag begint elke zet op het bord met het zetnummer (1. , 2. etc). Vervolgens komt de letter die het stuk vertegenwoordig (behalve bij pionnen daar is geen letter voor). Gevolgd door het "beginvlak" en het "eindvlak" op het bord.
Nu heb een redelijk stuk al voor elkaar, de enige situatie waarbij het fout gaat is wanneer een zet verspreid is over twee regels. Zoals bij zet 8 en 14. Ik zag dat er parameters waren voor multiline, maar dat is niet helemaal wat zoek.
Hoe kan ik dit nu het beste oplossen? Mijn code tot nu toe:
Output:
Java programma leest doormiddel van een regex een tekstfile in. Deze tekstfile bevat schaakzetten, dit gebeurd vaak in een vaste notatie namelijk PGN.
Een PGN file ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| 1. e4 e6 2. d4 d5 3. Nd2 Be7 4. Ngf3 Nf6 5. Bd3 c5 6. e5 Nfd7 7. c3 Nc6 8. O-O a5 9. Re1 cxd4 10. cxd4 Qb6 11. Nb1 Nxd4 12. Nxd4 Qxd4 13. Nc3 Bc5 14. Nb5 Qxf2+ 15. Kh1 O-O 16. Bg5 Bb6 17. Qh5 g6 18. Qh6 Bd8 19. Bxd8 { [%clk 0:19.44] } Rxd8 20. Rf1 { [%clk 0:14.17] } Qxb2 21. Rae1 { [%clk 0:12.38] } Rf8 22. Nc7 { [%clk 0:09.58] } Nxe5 { [%clk 0:19.59] } 23. Bb1 { [%clk 0:06.41] } Rb8 { [%clk 0:18.18] } 24. Qf4 { [%clk 0:04.47] } Nc6 { [%clk 0:17.36] } 25. Ne8 { [%clk 0:04.20] } f5 { [%clk 0:16.13] } 26. Nc7 { [%clk 0:02.37] } Qf6 { [%clk 0:14.50] } 27. Qd6 { [%clk 0:02.00] } Rd8 { [%clk 0:09.37] } 28. Qc5 { [%clk 0:01.51] } Kf7 { [%clk 0:07.26] } 29. Bc2 { [%clk 0:01.16] } Qe7 { [%clk 0:07.06] } 30. Qe3 { [%clk 0:00.20] } Qxc7 { [%clk 0:06.42] } 31. g4 { [%clk 0:00.19] } Kg8 { [%clk 0:06.02] } 32. gxf5 { [%clk 0:00.16] } exf5 { [%clk 0:05.52] } 33. Qg5 { [%clk 0:00.11] } Qf7 { [%clk 0:05.20] } 34. h4 { [%clk 0:00.07] } Be6 { [%clk 0:04.40] } 35. h5 { [%clk 0:00.06] } Rf8 { [%clk 0:04.15] } 36. hxg6 { [%clk 0:00.05] } hxg6 { [%clk 0:04.03] } 37. Rg1 { [%clk 0:00.04] } Kg7 0-1 6. e5 Nfd7 |
Zoals je misschien meteen zag begint elke zet op het bord met het zetnummer (1. , 2. etc). Vervolgens komt de letter die het stuk vertegenwoordig (behalve bij pionnen daar is geen letter voor). Gevolgd door het "beginvlak" en het "eindvlak" op het bord.
Nu heb een redelijk stuk al voor elkaar, de enige situatie waarbij het fout gaat is wanneer een zet verspreid is over twee regels. Zoals bij zet 8 en 14. Ik zag dat er parameters waren voor multiline, maar dat is niet helemaal wat zoek.
Hoe kan ik dit nu het beste oplossen? Mijn code tot nu toe:
code:
1
2
3
4
5
6
| String startNumber = "[1-9]{1,3}[.] "; String rokeren = "[O][-][O]"; String move = "[a-zA-Z]{1,3}[1-9] "; String or = "|"; Pattern.compile(startNumber +move+move + or+ startNumber + "(" +rokeren+")"); |
Output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| 1. e4 e6 2. d4 d5 3. Nd2 Be7 4. Ngf3 Nf6 5. Bd3 c5 6. e5 Nfd7 7. c3 Nc6 8. O-O ---------- hier mist a5 9. Re1 cxd4 11. Nb1 Nxd4 12. Nxd4 Qxd4 13. Nc3 Bc5 --------- hier mist zet 14 16. Bg5 Bb6 17. Qh5 g6 18. Qh6 Bd8 |