回答編集履歴

5

もういやだ(書式ミス)

2021/08/30 16:40

投稿

testset
testset

スコア221

test CHANGED
@@ -254,18 +254,10 @@
254
254
 
255
255
 
256
256
 
257
- - [正規表現で文字列を含まない、否定の記述 ](https://uxmilk.jp/50674) - uxmilk.jp
257
+ - [正規表現で文字列を含まない、否定の記述 ](https://uxmilk.jp/50674) - uxmilk.jp - 否定の指定方法
258
-
259
- - 否定の指定方法
258
+
260
-
261
- - [正規表現の構造化および処理(マッチ・グループ・キャプチャ)](https://smdn.jp/programming/netfx/regex/1_operations/) - smdn.jp
259
+ - [正規表現の構造化および処理(マッチ・グループ・キャプチャ)](https://smdn.jp/programming/netfx/regex/1_operations/) - smdn.jp - グループ化の方法
262
-
263
- - グループ化の方法
260
+
264
-
265
- - サクラエディタ→検索(Ctrl+F)→ヘルプ→「正規表現」
266
-
267
- - 正規表現のおおまかな機能と記法(注意:サクラエディタ限定のものもある)
261
+ - サクラエディタ→検索(Ctrl+F)→ヘルプ→「正規表現」- 正規表現のおおまかな機能と記法(注意:サクラエディタ限定のものもある)
268
-
262
+
269
- - [正規表現言語 - クイック リファレンス](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference) - docs.microsoft.com
263
+ - [正規表現言語 - クイック リファレンス](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference) - docs.microsoft.com - 説明が複雑奇怪すぎるので、サクラエディタのヘルプとクロスリファレンス
270
-
271
- - 説明が複雑奇怪すぎるので、サクラエディタのヘルプとクロスリファレンス

4

忘れ去られてた参考文献(わすれてない)

2021/08/30 16:40

投稿

testset
testset

スコア221

test CHANGED
@@ -243,3 +243,29 @@
243
243
 
244
244
 
245
245
  ```
246
+
247
+
248
+
249
+ 参考文献
250
+
251
+ -----------------
252
+
253
+ 本回答に辿り着く際に参照したリソース。
254
+
255
+
256
+
257
+ - [正規表現で文字列を含まない、否定の記述 ](https://uxmilk.jp/50674) - uxmilk.jp
258
+
259
+ - 否定の指定方法
260
+
261
+ - [正規表現の構造化および処理(マッチ・グループ・キャプチャ)](https://smdn.jp/programming/netfx/regex/1_operations/) - smdn.jp
262
+
263
+ - グループ化の方法
264
+
265
+ - サクラエディタ→検索(Ctrl+F)→ヘルプ→「正規表現」
266
+
267
+ - 正規表現のおおまかな機能と記法(注意:サクラエディタ限定のものもある)
268
+
269
+ - [正規表現言語 - クイック リファレンス](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference) - docs.microsoft.com
270
+
271
+ - 説明が複雑奇怪すぎるので、サクラエディタのヘルプとクロスリファレンス

3

実装1のリテラルを実装2と形式を合わせて違いがわかる?ように修正

2021/08/30 16:38

投稿

testset
testset

スコア221

test CHANGED
@@ -60,11 +60,23 @@
60
60
 
61
61
  // 正規表現 URLのみ: 正規表現の前方否定戻り読み「(?<!~)」でカッコやダブルクォーテーションがマッチしないようにする
62
62
 
63
- var regexUrlOnly = new Regex("(?<![\(\\"]\s*)" + expressionUrlGroup + "(?!\s*[\)\\"])",
63
+ var expressionUrlOnly = "(?<![\(\\"]\s*)" + expressionUrlGroup + "(?!\s*[\)\\"])";
64
-
64
+
65
- // ^^^^^^^ カッコやダブルクォーテーション
65
+ // ^^^^^^^ カッコやダブルクォーテーション
66
-
66
+
67
- // ^^^^ スペースを入れた場合の考慮
67
+ // ^^^^ スペースを入れた場合の考慮
68
+
69
+
70
+
71
+ // 正規表現 マークダウン
72
+
73
+ var expressionMarkdown = "\[(?<text>[^\]]*)\]\(\s*" + expressionUrlGroup + "\s*\)";
74
+
75
+
76
+
77
+ // 正規表現 URLのみ
78
+
79
+ var regexUrlOnly = new Regex(expressionUrlOnly,
68
80
 
69
81
  RegexOptions.IgnoreCase // 大文字小文字を区別しない
70
82
 
@@ -74,7 +86,7 @@
74
86
 
75
87
  // 正規表現 マークダウン
76
88
 
77
- var regexMarkdown = new Regex("\[(?<text>[^\]]*)\]\(\s*" + expressionUrlGroup + "\s*\)",
89
+ var regexMarkdown = new Regex(expressionMarkdown,
78
90
 
79
91
  RegexOptions.IgnoreCase // 大文字小文字を区別しない
80
92
 

2

実装2のコメント誤りを修正

2021/08/30 16:29

投稿

testset
testset

スコア221

test CHANGED
@@ -176,8 +176,6 @@
176
176
 
177
177
 
178
178
 
179
- // 正規表現 URLのみ: 正規表現の前方否定戻り読み「(?<!~)」でカッコやダブルクォーテーションがマッチしないようにする
180
-
181
179
  var regexUrl = new Regex(expressonAll,
182
180
 
183
181
  RegexOptions.IgnoreCase // 大文字小文字を区別しない

1

URLの正規表現を変更

2021/08/30 16:24

投稿

testset
testset

スコア221

test CHANGED
@@ -34,8 +34,6 @@
34
34
 
35
35
 
36
36
 
37
- #なぜか、実装2のほうが100ms実行時間が長かった。理由は調べていないので、言及できません。
38
-
39
37
 
40
38
 
41
39
  実装例1: 2段階で置換を行うパターン
@@ -50,43 +48,7 @@
50
48
 
51
49
  {
52
50
 
53
- var expressionUrl = "https?:\/\/"
54
-
55
- // ログイン関連
56
-
57
- + "((([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=]|:)*@)?"
58
-
59
- // ホスト名/IPv4/6
60
-
61
- + "(\[((([0-9a-f]{1,4}:){6}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
62
-
63
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|::([0-9a-f]{1,4}:){5}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
64
-
65
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|([0-9a-f]{1,4})?::([0-9a-f]{1,4}:){4}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
66
-
67
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:){3}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
68
-
69
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:){2}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
70
-
71
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
72
-
73
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
74
-
75
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(([0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)"
76
-
77
- + "|v[0-9a-f]+\.(([a-z]|[0-9]|[-._~])|[!$&'()*+,;=]|:)+)]|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
78
-
79
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}|(([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=])*)(:\d*)?"
80
-
81
- // スラッシュ以降
82
-
83
- + "(\/((([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=]|[:@]))*)*"
84
-
85
- + "(\?((([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=]|[:@])|[\/?])*)?"
86
-
87
- + "(#((([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=]|[:@])|[\/?])*)?"
88
-
89
- ; // from https://qiita.com/shimataro999/items/fced9665fa970c009c1e
51
+ var expressionUrl = "s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+";
90
52
 
91
53
 
92
54
 
@@ -182,43 +144,7 @@
182
144
 
183
145
  {
184
146
 
185
- var expressionUrl = "https?:\/\/"
186
-
187
- // ログイン関連
188
-
189
- + "((([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=]|:)*@)?"
190
-
191
- // ホスト名/IPv4/6
192
-
193
- + "(\[((([0-9a-f]{1,4}:){6}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
194
-
195
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|::([0-9a-f]{1,4}:){5}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
196
-
197
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|([0-9a-f]{1,4})?::([0-9a-f]{1,4}:){4}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
198
-
199
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:){3}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
200
-
201
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:){2}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
202
-
203
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
204
-
205
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
206
-
207
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(([0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(([0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)"
208
-
209
- + "|v[0-9a-f]+\.(([a-z]|[0-9]|[-._~])|[!$&'()*+,;=]|:)+)]|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
210
-
211
- + "(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}|(([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=])*)(:\d*)?"
212
-
213
- // スラッシュ以降
214
-
215
- + "(\/((([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=]|[:@]))*)*"
216
-
217
- + "(\?((([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=]|[:@])|[\/?])*)?"
218
-
219
- + "(#((([a-z]|[0-9]|[-._~])|%[0-9a-f][0-9a-f]|[!$&'()*+,;=]|[:@])|[\/?])*)?"
220
-
221
- ; // from https://qiita.com/shimataro999/items/fced9665fa970c009c1e
147
+ var expressionUrl = "s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+";
222
148
 
223
149
 
224
150