Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(string): 文字列の検索について #204

Merged
merged 12 commits into from
Mar 23, 2017
Merged

feat(string): 文字列の検索について #204

merged 12 commits into from
Mar 23, 2017

Conversation

azu
Copy link
Collaborator

@azu azu commented Mar 19, 2017

#121

文字列の検索

  • 部分文字列の検索 Stringメソッド
  • 正規表現による検索 RegExpメソッド
  • まとめ

先に結論(どういう使い分けをするのか)を書くべきか、後に書くべきかが迷い所。
後、正規表現は大体testでしかないのだけど、どういう対比がいいかなというのを考える

次の置換もほぼおなじ流れなので、使い分けについてはそこまでずらしても良いかなという印象がある。

  • StringメソッドでできるものはStringメソッドで
  • 正規表現はコメントや変数で説明しないと意図が残らないため
  • 正規表現で何でも使用とはしない ネストしたHTMLの探索などはパーサコンビネータとか

@azu azu added the WIP label Mar 19, 2017
var string = "ABC あいう DE えお";
// gフラグなしでは、最初の結果のみを持つ配列を返す
var results = string.match(/[a-zA-Z]+/);
console.log(results); // => ["ABC"]
Copy link
Collaborator Author

@azu azu Mar 20, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

テストしたいのだけど、String#matchの結果が配列であって配列でないからdeepEqualがこける。
配列なんだけど、 indexプロパティとかが生えてるキメラみたいな感じになってる。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image
そんな変態的なオブジェクトが来ているとは知らなかった(配列が帰ると教わったもので)

Copy link
Collaborator Author

@azu azu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

修正ポイント

```

検索している部分文字列は固定長であるため、一致した文字列は自明ですが、
`String#slice`と取得したインデックスを組み合わせることで検索結果を取得できます。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

地味にsliceに依存してるので、セクションを並び替え必要そう

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


#### 真偽値の取得 {#test-by-string}

「文字列」に「部分文字列」が含まれているかを検索する方法がいくつか用意されています。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

「文字列」に「部分文字列」 #205 でもでてきた用語の問題

console.log(string.includes("いる")); // => true
```

ES2015より前では`String#indexOf`メソッドしか固定文字列の検索できませんでした。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

以前だと <= なので、未満とか言いたいけど年に、
未満って言わない気がして、より前 にした

```

ES2015より前では`String#indexOf`メソッドしか固定文字列の検索できませんでした。
そのため、`String#inclues`メソッドを`indexOf`メソッドで表現するイディオムがありました。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+そのため、String#incluesメソッドをindexOfメソッドで表現するイディオムがありました。

indexOfのイディオムの話 -> 今はそれを使う必要ないよ -> includesの話

のように順番を並び替えたほうがいいかも。


### 正規表現による検索 {#search-by-regexp}

正規表現による検索は、正規表現オブジェクトを利用します。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+正規表現による検索は、正規表現オブジェクトを利用します。

何か当たり前すぎる?

正規表現オブジェクトのメソッドや正規表現オブジェクトを引数に取れるStringメソッドを利用します。

ながいな

console.log(/いる/.test(string)); // => true
```

その他にも、正規表現では繰り返しやホワイトスペースなどを特殊文字で表現できるため、
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

- その他にも、正規表現では繰り返しやホワイトスペースなどを特殊文字で表現できるため、
+ その他にも、正規表現では繰り返しや文字の集合などを特殊文字で表現できるため、

```

その他にも、正規表現では繰り返しやホワイトスペースなどを特殊文字で表現できるため、
Stringメソッドによる検索より曖昧検索が簡単に書くことができます。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

曖昧検索

柔軟と曖昧が同じ意味で使われてるのは、どちらかに統一した方がよさそう。


### 文字列と正規表現どちらを使うべきか

Stringメソッドでできることは正規表現でもできることがわかりました。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

- Stringメソッドでできることは正規表現でもできることがわかりました。
+ Stringメソッドでできる検索は正規表現でもできることがわかりました。

Stringメソッドでできることは正規表現でもできることがわかりました。
Stringメソッドと正規表現で同じ結果が得られる場合はどちらを利用するのがよいでしょうか?

正規表現は曖昧な検索に強く、特殊文字を使うことで柔軟な検索結果を得ることができます。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

曖昧と柔軟が同時に出てきている。

パターンによる検索が強く、それによって柔軟な検索ができる

とかかな

「Stringメソッドと正規表現で同じ結果が得られる場合はどちらを利用するのがよいでしょうか?」という疑問に戻ります。
Stringメソッドで表現できることはStringメソッドで表現し、柔軟性や曖昧な検索が必要な場合はコメントとともに正規表現を利用するという方針を推奨します。

正規表現についてより詳しくは[正規表現 - JavaScript | MDN][]や、コンソールで実行しながら試せる[regex101][]のようなサイトを参照してください。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

実際に色々なパターンを試して見てなれるのがよいでしょう。

ここへ移動させたい

@azu
Copy link
Collaborator Author

azu commented Mar 23, 2017

「文字列」「部分文字列」「検索文字列」「パターン」の表記は後で揃えたい

@azu
Copy link
Collaborator Author

azu commented Mar 23, 2017

何となく 文字列は「一致」
正規表現は「マッチ」
としてるけど、この使い分けも曖昧

そのため、マッチした文字列そのものを取得するには`RegExp#exec`メソッドか`String#match`メソッドを利用します。
これらのメソッドは、正規表現の繰り返す`g`フラグ(globalの略称)と組み合わせてよく利用されます。

- `String#match(正規表現)`: 文字列中で一致するものを検索する
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これ一致になってておかしい

@azu
Copy link
Collaborator Author

azu commented Mar 23, 2017

#208 ようごの統一は別Issueにした

@azu azu merged commit 0a1d4c1 into master Mar 23, 2017
@azu azu deleted the string-search branch March 23, 2017 15:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants