回答編集履歴

3

typo

2023/08/14 03:39

投稿

ikedas
ikedas

スコア4443

test CHANGED
@@ -5,7 +5,7 @@
5
5
  ---
6
6
  【2023-08-14追記】
7
7
 
8
- [yamabejp さんのご回答](https://teratail.com/questions/mfkaqhpbuakayg#reply-u6b3sctunhavhc) に対して。
8
+ [yambejp さんのご回答](https://teratail.com/questions/mfkaqhpbuakayg#reply-u6b3sctunhavhc) に対して。
9
9
 
10
10
  データベースサーバはまさにその「作成済みのクエリ―の評価」をしていますので、それをプログラミングで実現すること自体は可能であるはずです。
11
11
 

2

微修正

2023/08/14 03:24

投稿

ikedas
ikedas

スコア4443

test CHANGED
@@ -9,13 +9,13 @@
9
9
 
10
10
  データベースサーバはまさにその「作成済みのクエリ―の評価」をしていますので、それをプログラミングで実現すること自体は可能であるはずです。
11
11
 
12
- また、次のような理由でSQL文の整形自体は挑戦しがいのあるテーマとも思いますので、「無意味」と言い切るのもどうかと思います。
12
+ また、次のような理由でクエリの整形自体は挑戦しがいのあるテーマとも思いますので、「無意味」と言い切るのもどうかと思います。
13
13
 
14
14
  質問者さんが質問当初考えていらっしゃったような「正規表現を使ってキーワードの境界を識別する」という方法に限界があるのは明らかです。正規表現では通常、SQLをはじめとするプログラミング言語を表現できるほどの複雑なテキストパターンを扱えないからです。一部の環境でサポートされるいわゆる「拡張正規表現」を使えばできるときもありますが、大変分かりにくく使いにくいものです。
15
15
 
16
16
  つまり簡単に言うと、正規表現というのは (初心者向けの解説でしばしばそう言われているような) 万能なものでも自由なものでもないのです。ある程度複雑なことをやろうとするならば、むしろ正規表現を使うことは控えたほうがよいです。
17
17
 
18
- SQLなどプログラミング言語のテキストを正しく評価するには、「トークン化」(tokenize) と「構文解析」(parse) という2段階の処理が必要です。たとえばカラム名がかりに「TEST FROM」という特殊なものだったときでも、それをひとつのトークンとして識別できれば、それを含むSQL文を正しく解析できます。
18
+ SQLのクエリなどプログラミング言語のテキストを正しく評価するには、「トークン化」(tokenize) と「構文解析」(parse) という2段階の処理が必要です。たとえばカラム名がかりに「TEST FROM」という特殊なものだったときでも、それをひとつのトークンとして識別できれば、それを含むクエリを正しく解析できます。
19
19
 
20
20
  上で紹介したSqlFormatterは、まさにこれをやっています。トークン化を行ってから、構文規則に基づいて整形やシンタックスハイライティングをしています。そのため、特殊なカラム名なども文法的に正しく表記されていれば正しく扱えます。こういったことは正規表現だけでは実現できないことです。
21
21
 

1

2023-08-14追記

2023/08/14 03:20

投稿

ikedas
ikedas

スコア4443

test CHANGED
@@ -2,3 +2,22 @@
2
2
 
3
3
  こういうものを参考にして、自分の欲しい機能を作成されればよいのではないでしょうか (それか自分でコードを書かずにこれを使うことにするか)。
4
4
 
5
+ ---
6
+ 【2023-08-14追記】
7
+
8
+ [yamabejp さんのご回答](https://teratail.com/questions/mfkaqhpbuakayg#reply-u6b3sctunhavhc) に対して。
9
+
10
+ データベースサーバはまさにその「作成済みのクエリ―の評価」をしていますので、それをプログラミングで実現すること自体は可能であるはずです。
11
+
12
+ また、次のような理由でSQL文の整形自体は挑戦しがいのあるテーマとも思いますので、「無意味」と言い切るのもどうかと思います。
13
+
14
+ 質問者さんが質問当初考えていらっしゃったような「正規表現を使ってキーワードの境界を識別する」という方法に限界があるのは明らかです。正規表現では通常、SQLをはじめとするプログラミング言語を表現できるほどの複雑なテキストパターンを扱えないからです。一部の環境でサポートされるいわゆる「拡張正規表現」を使えばできるときもありますが、大変分かりにくく使いにくいものです。
15
+
16
+ つまり簡単に言うと、正規表現というのは (初心者向けの解説でしばしばそう言われているような) 万能なものでも自由なものでもないのです。ある程度複雑なことをやろうとするならば、むしろ正規表現を使うことは控えたほうがよいです。
17
+
18
+ SQL文などプログラミング言語のテキストを正しく評価するには、「トークン化」(tokenize) と「構文解析」(parse) という2段階の処理が必要です。たとえばカラム名がかりに「TEST FROM」という特殊なものだったときでも、それをひとつのトークンとして識別できれば、それを含むSQL文を正しく解析できます。
19
+
20
+ 上で紹介したSqlFormatterは、まさにこれをやっています。トークン化を行ってから、構文規則に基づいて整形やシンタックスハイライティングをしています。そのため、特殊なカラム名なども文法的に正しく表記されていれば正しく扱えます。こういったことは正規表現だけでは実現できないことです。
21
+
22
+ このようなものを参考にして、質問者さんがやりたいことを実現してみていただきたいです。
23
+