回答編集履歴

6

テキスト修正

2020/01/29 00:02

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -130,7 +130,7 @@
130
130
 
131
131
 
132
132
 
133
- func getFirstLevelBrackededTokens(text string) []string {
133
+ func getFirstLevelBracketedTokens(text string) []string {
134
134
 
135
135
  xml := getXML(text)
136
136
 
@@ -170,13 +170,13 @@
170
170
 
171
171
  func main() {
172
172
 
173
- tokens := getFirstLevelBrackededTokens("{{今日}}はいい{{天気}}。")
173
+ tokens := getFirstLevelBracketedTokens("{{今日}}はいい{{天気}}。")
174
174
 
175
175
  fmt.Println(tokens)
176
176
 
177
177
 
178
178
 
179
- tokens = getFirstLevelBrackededTokens("{{今日は{{いい}}天気}}。")
179
+ tokens = getFirstLevelBracketedTokens("{{今日は{{いい}}天気}}。")
180
180
 
181
181
  fmt.Println(tokens)
182
182
 
@@ -188,7 +188,7 @@
188
188
 
189
189
 
190
190
 
191
- 上記のコードで、 関数 `getFirstLevelBrackededTokens` は、
191
+ 上記のコードで、 関数 `getFirstLevelBracketedTokens(text string)` は、
192
192
 
193
193
 
194
194
 

5

テキスト修正

2020/01/29 00:02

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- 上記に対する、[私の回答](https://teratail.com/questions/237764#reply-345771) や、この回答から参照されている、さらに以前の類似質問への[回答](https://teratail.com/questions/234191#reply-341047) にも書きましたが、開くカッコと閉じるカッコがきちんと対応して出現し、かつ、カッコのネストもあるような文字列にマッチする正規表現を書くことは困難です。
25
+ 上記に対する、[私の回答](https://teratail.com/questions/237764#reply-345771) や、この回答から参照されている、さらに以前の類似質問への[回答](https://teratail.com/questions/234191#reply-341047) にも書きましたが、開くカッコと閉じるカッコがきちんと対応して出現し、かつ、カッコのネストもあるような文字列にマッチする正規表現を書くことは(標準の正規表現では)困難です。
26
26
 
27
27
 
28
28
 

4

テキスト修正

2020/01/28 15:26

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -210,7 +210,7 @@
210
210
 
211
211
 
212
212
 
213
- もし、上記のようなXML(などの他のフォーマット)に変換してそれに対する既存のパーサーを使うという方法を採らずに、直接、所与の文字列パーーを自作しようとすると、左から読んでいき、 `{{` が出現するたびに、それを何らかのスタック構造に積み、 `}}` が見つかったらスタックからポップさせるような(プッシュダウンオートマトンの動きをする)プログラムを書くことになり、それなりに書くのに労力を要するものになるのではと思います。
213
+ もし、上記のようなXML(などの他のフォーマット)に変換してそれに対する既存のパーサーを使うという方法を採らずに、直接、所与の文字列パースするコを自作しようとすると、左から読んでいき、 `{{` が出現するたびに、それを何らかのスタック構造に積み、 `}}` が見つかったらスタックからポップさせるような(プッシュダウンオートマトンの動きをする)プログラムを書くことになり、それなりに書くのに労力を要するものになるのではと思います。
214
214
 
215
215
 
216
216
 

3

テキスト修正

2020/01/28 11:58

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -210,7 +210,7 @@
210
210
 
211
211
 
212
212
 
213
- もし、上記のようなXML(などの他のフォーマット)に変換してそれに対する既存のパーサーを使うという方法を採らずに、直接、所与の文字列のパーサーを書こうとすると、左から読んでいき、 `{{` が出現するたびに、それを、何らかのスタック構造に積み、 `}}` が見つかったらスタックからポップさせるようなプログラムを書くことになり、それなりに書くのに労力を要するものになるのではと思います。
213
+ もし、上記のようなXML(などの他のフォーマット)に変換してそれに対する既存のパーサーを使うという方法を採らずに、直接、所与の文字列のパーサーを自作しようとすると、左から読んでいき、 `{{` が出現するたびに、それを、何らかのスタック構造に積み、 `}}` が見つかったらスタックからポップさせるようなッシュダウンオートマトンの動きをする)プログラムを書くことになり、それなりに書くのに労力を要するものになるのではと思います。
214
214
 
215
215
 
216
216
 

2

テキスト修正

2020/01/28 11:14

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -130,7 +130,7 @@
130
130
 
131
131
 
132
132
 
133
- func getFirstLebelBrackededTokens(text string) []string {
133
+ func getFirstLevelBrackededTokens(text string) []string {
134
134
 
135
135
  xml := getXML(text)
136
136
 
@@ -170,13 +170,13 @@
170
170
 
171
171
  func main() {
172
172
 
173
- tokens := getFirstLebelBrackededTokens("{{今日}}はいい{{天気}}。")
173
+ tokens := getFirstLevelBrackededTokens("{{今日}}はいい{{天気}}。")
174
174
 
175
175
  fmt.Println(tokens)
176
176
 
177
177
 
178
178
 
179
- tokens = getFirstLebelBrackededTokens("{{今日は{{いい}}天気}}。")
179
+ tokens = getFirstLevelBrackededTokens("{{今日は{{いい}}天気}}。")
180
180
 
181
181
  fmt.Println(tokens)
182
182
 
@@ -188,7 +188,7 @@
188
188
 
189
189
 
190
190
 
191
- 上記のコードで、 関数 `getFirstLebelBrackededTokens` は、
191
+ 上記のコードで、 関数 `getFirstLevelBrackededTokens` は、
192
192
 
193
193
 
194
194
 

1

テキスト修正

2020/01/28 11:06

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,15 @@
2
2
 
3
3
 
4
4
 
5
- 以下回答では、Go言語のコード提示はせず、考え方の提案のみになりますのでご了承ください
5
+ まず、考え方を示し、そ、Golangによるコード例を挙げます。
6
+
7
+
8
+
9
+
10
+
11
+ ### 考え方
12
+
13
+
6
14
 
7
15
 
8
16
 
@@ -72,7 +80,137 @@
72
80
 
73
81
 
74
82
 
83
+ ### コード例
84
+
85
+
86
+
87
+ 以下、上記の考え方で作成したコード例です。XMLのパースとXPathによる要素取得のために、[github.com/antchfx/xmlquery](https://github.com/antchfx/xmlquery) を使いました。
88
+
89
+
90
+
91
+ ```Golang
92
+
93
+ package main
94
+
95
+
96
+
97
+ import (
98
+
99
+ "fmt"
100
+
101
+ "github.com/antchfx/xmlquery"
102
+
103
+ "log"
104
+
105
+ "strings"
106
+
107
+ )
108
+
109
+
110
+
111
+ func getXML(text string) string {
112
+
113
+ text = strings.Replace(text, "{{", "<node>", -1)
114
+
115
+ text = strings.Replace(text, "}}", "</node>", -1)
116
+
117
+ text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
118
+
119
+ "<root>\n" +
120
+
121
+ text +
122
+
123
+ "\n</root>"
124
+
125
+
126
+
127
+ return text
128
+
129
+ }
130
+
131
+
132
+
133
+ func getFirstLebelBrackededTokens(text string) []string {
134
+
135
+ xml := getXML(text)
136
+
137
+
138
+
139
+ doc, err := xmlquery.Parse(strings.NewReader(xml))
140
+
141
+ if err != nil {
142
+
143
+ log.Fatal(err)
144
+
145
+ return nil
146
+
147
+ }
148
+
149
+
150
+
151
+ var tokens []string
152
+
153
+ for _, n := range xmlquery.Find(doc, "/root/node") {
154
+
155
+ str := strings.Replace(n.OutputXML(false), "<node>", "{{", -1)
156
+
157
+ str = strings.Replace(str, "</node>", "}}", -1)
158
+
159
+ tokens = append(tokens, str)
160
+
161
+ }
162
+
163
+
164
+
165
+ return tokens
166
+
167
+ }
168
+
169
+
170
+
171
+ func main() {
172
+
173
+ tokens := getFirstLebelBrackededTokens("{{今日}}はいい{{天気}}。")
174
+
175
+ fmt.Println(tokens)
176
+
177
+
178
+
179
+ tokens = getFirstLebelBrackededTokens("{{今日は{{いい}}天気}}。")
180
+
181
+ fmt.Println(tokens)
182
+
183
+ }
184
+
185
+
186
+
187
+ ```
188
+
189
+
190
+
191
+ 上記のコードで、 関数 `getFirstLebelBrackededTokens` は、
192
+
193
+
194
+
195
+ - `"{{今日}}はいい{{天気}}。"` に対しては、 `["今日","天気"]` を返します。
196
+
197
+ - `"{{今日は{{いい}}天気}}。"` に対しては、 `["今日は{{いい}}天気"]` を返します。
198
+
199
+
200
+
201
+
202
+
203
+ 以下にて動作確認できます。
204
+
205
+
206
+
207
+ - **動作確認用Repl.it** [https://repl.it/@jun68ykt/Q238025](https://repl.it/@jun68ykt/Q238025)
208
+
209
+
210
+
211
+
212
+
75
- もし、上記のような方法を採らずに、自分でパーサーを書こうとすると、左から読んでいき、 `{{` が出現するたびに、それを、何らかのスタック構造に積み、 `}}` が見つかったらスタックからポップさせるようなプログラムを書くことになり、それなりに書くのに労力を要するものになるのではと思います。
213
+ もし、上記のようなXML(などの他のフォーマット)に変換してそれに対する既存のパーサーを使うという方法を採らずに、直接、所与の文字列のパーサーを書こうとすると、左から読んでいき、 `{{` が出現するたびに、それを、何らかのスタック構造に積み、 `}}` が見つかったらスタックからポップさせるようなプログラムを書くことになり、それなりに書くのに労力を要するものになるのではと思います。
76
214
 
77
215
 
78
216