回答編集履歴

3

変更

2016/09/01 02:39

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -10,13 +10,13 @@
10
10
 
11
11
 
12
12
 
13
- 何通りか書いておきます.一番上が最もおすすめです.
13
+ 何通りか書いておきます.
14
14
 
15
15
 
16
16
 
17
17
  ```bash
18
18
 
19
- perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/' < before.html > after.html
19
+ perl -0pe 's/<title>(.*?)<\/title>\K/\n<h1>$1<\/h1>/s' < before.html > after.html
20
20
 
21
21
  ```
22
22
 
@@ -32,11 +32,9 @@
32
32
 
33
33
  ```bash
34
34
 
35
- perl -0pe 's/<title>(.*?)<\/title>\K/\n<h1>$1<\/h1>/s' < before.html > after.html
35
+ perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/' < before.html > after.html
36
36
 
37
37
  ```
38
-
39
-
40
38
 
41
39
 
42
40
 

2

gフラグを削除

2016/09/01 02:39

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ```bash
18
18
 
19
- perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/g' < before.html > after.html
19
+ perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/' < before.html > after.html
20
20
 
21
21
  ```
22
22
 
@@ -24,7 +24,7 @@
24
24
 
25
25
  ```bash
26
26
 
27
- perl -0pe 's/<title>([^<]*)<\/title>\K/\n<h1>$1<\/h1>/g' < before.html > after.html
27
+ perl -0pe 's/<title>([^<]*)<\/title>\K/\n<h1>$1<\/h1>/' < before.html > after.html
28
28
 
29
29
  ```
30
30
 
@@ -32,7 +32,7 @@
32
32
 
33
33
  ```bash
34
34
 
35
- perl -0pe 's/<title>(.*?)<\/title>\K/\n<h1>$1<\/h1>/gs' < before.html > after.html
35
+ perl -0pe 's/<title>(.*?)<\/title>\K/\n<h1>$1<\/h1>/s' < before.html > after.html
36
36
 
37
37
  ```
38
38
 
@@ -91,3 +91,7 @@
91
91
  こちらは**バックトラッキングの抑制**を明示しており,無駄が全く無いことが保証されます.
92
92
 
93
93
 
94
+
95
+ また普通はあり得ませんが,もし`<title></title>`が複数回現れる場合は`g`フラグを有効にすることで対処します.
96
+
97
+

1

補足

2016/08/31 23:17

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -10,11 +10,33 @@
10
10
 
11
11
 
12
12
 
13
+ 何通りか書いておきます.一番上が最もおすすめです.
14
+
15
+
16
+
17
+ ```bash
18
+
19
+ perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/g' < before.html > after.html
20
+
21
+ ```
22
+
23
+
24
+
25
+ ```bash
26
+
27
+ perl -0pe 's/<title>([^<]*)<\/title>\K/\n<h1>$1<\/h1>/g' < before.html > after.html
28
+
29
+ ```
30
+
31
+
32
+
13
33
  ```bash
14
34
 
15
35
  perl -0pe 's/<title>(.*?)<\/title>\K/\n<h1>$1<\/h1>/gs' < before.html > after.html
16
36
 
17
37
  ```
38
+
39
+
18
40
 
19
41
 
20
42
 
@@ -35,3 +57,37 @@
35
57
  **サブパターンは保持しつつ**,マッチング開始位置をそこにリセットする.
36
58
 
37
59
  これを末尾に持ってくると**「マッチした場所に挿入」**という処理が無駄な置換をすることなく実現できる.
60
+
61
+
62
+
63
+ `(.*?)`:
64
+
65
+ 任意の文字の0回以上の繰り返しに対する最短マッチ.
66
+
67
+ `s`フラグを入れないと改行文字が対象にならない点に注意してください.
68
+
69
+ 1文字マッチさせるごとに「後ろに`</title>`があるか?」をチェックするのであまり効率は良くないです.
70
+
71
+
72
+
73
+ `[^<]*`:
74
+
75
+ `<`以外の0回以上の繰り返しに対する**最長**マッチ.
76
+
77
+ 文字種を限定することで最長マッチに安心してかけられます.
78
+
79
+ ただしこれはまだ不必要にバックトラッキングを起こす可能性があります.
80
+
81
+ (Perlの正規表現エンジンはかなり賢いので最適化でうまいことやってくれる可能性もあります)
82
+
83
+
84
+
85
+ `[^<]*+`:
86
+
87
+ `<`以外の0回以上の繰り返しに対する**最長**マッチ.
88
+
89
+ 文字種を限定することで最長マッチに安心してかけられます.
90
+
91
+ こちらは**バックトラッキングの抑制**を明示しており,無駄が全く無いことが保証されます.
92
+
93
+