回答編集履歴
2
加筆
test
CHANGED
@@ -1,25 +1,53 @@
|
|
1
|
+
(3/2加筆)
|
2
|
+
|
1
3
|
> ※1…否定先読みの効果で一気に二個目の<b>まで飛ばされるのか、任意の一文字を意味する.にマッチする「billions」を正規表現で処理してから、否定先読みの効果で正規表現が失敗するのかがわからない。
|
2
4
|
|
5
|
+
まず、正規表現の構成方法について説明します。
|
6
|
+
|
7
|
+
ある表現を元に新しい表現を作る方法は、3つあります。
|
8
|
+
|
9
|
+
- **連接**
|
10
|
+
表現`A`と表現`B`があるとき、表現`AB`は「`A`がマッチする文字列の後に`B`がマッチする文字列が続く」ということを意味します。
|
11
|
+
- **選択**
|
12
|
+
表現`A`と表現`B`があるとき、表現`A|B`は「`A`がマッチする文字列か、`B`がマッチする文字列」を意味します。
|
13
|
+
- **量化**
|
14
|
+
表現`A`があるとき、表現`A*`、`A+`はそれぞれ「`A`がマッチする文字列が0回以上続く」「`A`がマッチする文字列が1回以上続く」ということを意味します。
|
15
|
+
また`A?`、`A{m,n}`はそれぞれ「`A`がマッチする文字列が0回以上1回以下続く」「`A`がマッチする文字列が`m`回以上`n`回以下続く」ということを意味します。
|
16
|
+
他の量指定子`*?`、`+?`、`??`、`{m,n}?`なども同様です。
|
17
|
+
|
18
|
+
部分表現をまとめるために括弧を使ったりもしますが、原理的には上の3つの方法を組み合わせることで、ある正規表現から新しい正規表現を作れます。
|
19
|
+
|
3
|
-
|
20
|
+
次に、貪欲な量指定子と非貪欲な量指定子の挙動について説明します。
|
4
21
|
|
5
22
|
量指定子が**貪欲**であることを、[以前のご質問の回答](https://teratail.com/questions/65687#reply-103924)では「できるだけ長くマッチしようとすること」、裏を返せば「できるだけ短くマッチしないようにすること」だと説明しました。
|
23
|
+
|
24
|
+
具体的には、表現`A`と`B`があるとき、`A*B`は次のような動作をすることになります。
|
25
|
+
|
26
|
+
1. 最初は`A`がマッチする文字列のできるだけ多くの回数の繰り返しにマッチする。
|
27
|
+
2. 次に、`B`がマッチしなければバックトラックが起きる。`A`がマッチする文字列の1回少ない繰り返しのマッチを再試行する。
|
28
|
+
3. 次に、`B`がマッチしなければバックトラックが起きる。`A`がマッチする文字列の2回少ない繰り返しのマッチを再試行する。
|
29
|
+
……
|
30
|
+
……
|
31
|
+
4. 最後に、`B`がマッチすれば`A*B`全体がマッチに成功。
|
32
|
+
|
33
|
+
これにより表現`A*B`は、「`A`がマッチする文字列の最大回数の繰り返しのあとに`B`がマッチするが続く」を意味することになります。
|
6
34
|
|
7
35
|
**非貪欲**であることはこの逆なので、「できるだけ短くマッチしようとすること」、裏を返せば「できるだけ長くマッチしないようにすること」であると考えることができます。
|
8
36
|
|
9
37
|
具体的には、表現`A`と`B`があるとき、`A*?B`は次のような動作をすることになります。
|
10
38
|
|
11
|
-
1. 最初は`A`の0回の繰り返し (空文字列) にマッチする。
|
39
|
+
1. 最初は`A`がマッチする文字列の0回の繰り返し (空文字列) にマッチする。
|
12
|
-
2. 次に、`B`
|
40
|
+
2. 次に、`B`がマッチしなければバックトラックが起きる。`A`がマッチする文字列の1回の繰り返しのマッチを再試行する。
|
13
|
-
3. 次に、`B`
|
41
|
+
3. 次に、`B`がマッチしなければバックトラックが起きる。`A`がマッチする文字列の2回の繰り返しのマッチを再試行する。
|
14
42
|
……
|
15
43
|
……
|
16
|
-
4. 最後に、`B`
|
44
|
+
4. 最後に、`B`がマッチすれば`A*?B`全体がマッチに成功。
|
17
45
|
|
18
|
-
これにより`A*?B`は、「`A`の最小回数の繰り返しのあとに`B`が
|
46
|
+
これにより表現`A*?B`は、「`A`がマッチする文字列の最小回数の繰り返しのあとに`B`がマッチする文字列が続く」を意味することになります。
|
19
47
|
|
20
48
|
次に、量指定子の適用のされかたについて説明します。
|
21
49
|
|
22
|
-
`((?!</?b>).)*?`はあくまでも、「`(?!</?b>).`に量指定子`*?`が適用されている」という表現です。
|
50
|
+
`((?!</?b>).)*?`はあくまでも、「`(?!</?b>).`に量指定子`*?`が適用されている」(量化されている) という表現です。
|
23
51
|
|
24
52
|
`(`…`)*?`の内部のマッチの結果によってバックトラックや再試行がとばされる、といったことはありません。
|
25
53
|
|
1
typos\.
test
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
1. 最初は`A`の0回の繰り返し (空文字列) にマッチする。
|
12
12
|
2. 次に、`B`にマッチしなければバックトラックが起きる。`A`の1回の繰り返しのマッチを再試行する。
|
13
13
|
3. 次に、`B`にマッチしなければバックトラックが起きる。`A`の2回の繰り返しのマッチを再試行する。
|
14
|
+
……
|
14
15
|
……
|
15
16
|
4. 最後に、`B`にマッチすれば`A*?B`全体のマッチが成功。
|
16
17
|
|
@@ -26,5 +27,5 @@
|
|
26
27
|
|
27
28
|
『詳説 正規表現 第3版』では、非貪欲な量指定子の挙動を`??`についてしか詳しく説明していないようです。この`??`の場合は、「最初はマッチをとばしておき、失敗したら1回のマッチを試す」という見かたもできます。
|
28
29
|
|
29
|
-
しかし上述の通り、一般に他の非貪欲な量指定子の`*?`、`+?`、`{…,…}`には「とばす」という見かたは当てはまらないです。
|
30
|
+
しかし上述の通り、一般に他の非貪欲な量指定子の`*?`、`+?`、`{…,…}?`には「とばす」という見かたは当てはまらないです。
|
30
31
|
|