回答編集履歴

1

微加筆

2024/02/20 09:42

投稿

ikedas
ikedas

スコア4364

test CHANGED
@@ -1,6 +1,8 @@
1
1
  「正規表現を用いて最初の『徒歩○○分』までの文字列を抽出」はできていて、そこから駅名だけを抽出する、ということで回答します。
2
2
 
3
3
  ___
4
+
5
+ 前置き。
4
6
 
5
7
  まず気に留めたほうがよいこととして、**正規表現マッチングの原則** というものがあります。
6
8
 
@@ -30,19 +32,21 @@
30
32
  使うのは通常の正規表現、つまり `?`、`*`、`+`、`{}`、`.`、`[]`、`|`、`()` だけにするほうがよいです。それでできないことは正規表現以外の方法を考えましょう。
31
33
 
32
34
  ___
33
- 前置きが長くなりましたが、今回のように駅名を抽出するにはまず、その直前 (左隣) の線名に正確にマッチする正規表現を作る必要があります。なぜなら、いきなり駅名にマッチさせようとしても、線名の範囲に駅名と紛らわしいものがあると「最左」原則によって誤マッチしてしまうからです。逆に、線名に正確にマッチできれば「重なり合わない」原則によって、マッチした範囲の直後から駅名が始まることが確定します。
35
+ 前置きが長くなりましたが、今回のように駅名を抽出するにはまず、その直前 (左隣) の線名に正確にマッチする正規表現を作る必要があります。なぜなら、いきなり駅名にマッチさせようとしても、線名の範囲に駅名と紛らわしいものがあると「最左」原則によって誤マッチしてしまうからです。逆に、線名に正確にマッチできれば「重なり合わない」原則によって、マッチした範囲の直後から駅名が始まることが確定します。
34
36
 
37
+ 線区名は「◯◯線」(そのあとに括弧書きがつくことがある) という形が基本ですが「線」がつかなかったり途中に「線」が入る例外もあります。
38
+
35
- 路線名は「◯◯線」(そのあとに括弧書きがつくことがある) という形が基本ですが「線」がつかなかったり途中に「線」が入る例外もありす。基本については「最長」原則でマッチさせられます (下記で二重になっている括弧のうち内側のものは全角括弧で、正規表現の括弧ではありません)。
39
+ ず、基本については「最長」原則でマッチさせられます (下記で二重になっている括弧のうち内側のものは全角括弧で、正規表現の括弧ではありません)。
36
40
  ```
37
41
  [^線]+線(([^)]+))?
38
42
  ```
39
43
  これに例外を加えます。`|`で区切って並べた正規表現は順に試行され、マッチするものが見つかったらそれ以後の正規表現は試されません。下記ではたとえば「横浜市営地下鉄ブルーライン」にマッチしたらそれ以降の「◯◯線」などにマッチすることはありません。
40
44
  ```
41
- (横浜市営地下鉄ブルーライン|横須賀線・総武快速線|その他例外...|[^線]+線)(([^)]+))?
45
+ (横浜市営地下鉄ブルーライン|総武快速・横須賀線|その他例外...|[^線]+線)(([^)]+))?
42
46
  ```
43
- これで文字列先頭からマッチさせれば、マッチの終わったところから駅名が始まるはずですね。また駅名の後ろは「徒歩x分」で終わることも決まっています。文字列の末尾が「徒歩x分」にマッチしなければならないようにすると、「重なり合わない」原則により、駅名はその前で終わります。
47
+ これで文字列先頭からマッチさせれば、マッチの終わったところから駅名が始まるはずですね。また駅名の後ろは「徒歩x分」で終わることも決まっています。文字列の末尾が「徒歩x分」にマッチしなければならないようにする (下記では`$`が最後についていますから、これがマッチできる「最も左」の位置は文字列末尾だけです) と、「重なり合わない」原則により、駅名はその前で終わります。
44
48
  ```
45
- ^(横浜市営地下鉄ブルーライン|横須賀線・総武快速線|その他例外...|[^線]+線)(([^)]+))?(.+)徒歩\d+分$
49
+ ^(横浜市営地下鉄ブルーライン|総武快速・横須賀線|その他例外...|[^線]+線)(([^)]+))?(.+)徒歩\d+分$
46
50
  ```
47
- したがって、上記の正規表現では3つ目のグループある `(.+)` が駅名にマッチします。
51
+ したがって、上記の正規表現では3つ目のグループる `(.+)` が駅名にマッチします。
48
52