16258

[code]

    private object RegexPattern {
    
        val ArticlePattern = "-?\\d+(\\.\\d+)?"
    
    }
    
    private val articleRegex by Delegates.lazy {
    
        WebViewActivity.RegexPattern.ArticlePattern.toRegex()
    
    }
    
    private fun setupUri() {
    
        if (this.uri == null) {
    
            val u = getIntent()
                    .getStringExtra(
                            getResources()
                                    .getString(R.string.default_webview_activity_uri)
                    )
            //urlがnullじゃない場合
            if (u != null) {
    
                //もしuがnullの場合NullPointerException
                val parsedUri = Uri.parse(u)
    
                //ドメインがぐーぐる（teru or false）
                val isGoogle = Constants.isGoogleDomain(parsedUri)
    
                //ドメインがぐーぐるのの場合
                val newUri: Uri = if (isGoogle) {
    
    
                    val isArticle = parsedUri.getLastPathSegment().matches(articleRegex)
    
                    //articleの場合？
                    val builder: Uri.Builder = if (isArticle) {
    
                        val identifier = parsedUri.getLastPathSegment().toInt()
    
                        User.addHistory(identifier)
    
                        val favored = User.containsInBookmark(identifier)
    
                        val flag = if (favored) {
                            1
                        } else {
                            0
                        }
    
                        parsedUri.buildUpon()
                                .appendQueryParameter("favored", "$flag")
    
[/code]

質問です。

[code]

    val isArticle = parsedUri.getLastPathSegment().matches(articleRegex)
    
[/code]

の部分について、どんな処理でしょうか？

`getLastPathSegment()`について調べたところ、

> "URIのpath部から最後のセグメントをデコードして抽出する。"

これはどうゆう意味でしょうか？

URLによっては`isArticle`にtureかfalse返す前にエラーで落ちてしまいますが、エラー発生条件がわかりません。デバッグでは`Uri.java`を通過したあとにエラーになります。


CC BY-SA 3.0
2015-09-04T10:09:16.993
16249
2015-09-04T12:34:58.547
2015-09-04T11:45:50.917
5337
10715
question
android java android-studio kotlin
.getLastPathSegment().matchesについて教えて下さい。


複数の質問がありますが、何を尋ねたいのか不明瞭になるので、一つに絞ると良いと思います。

`getLastPathSegment()`の処理は文字通り、最後のセグメントを取得するものです。この意味について理解するには、`Uniform
Resource
Identifier`の構造を参照する必要があります。完全な仕様については、[RFC3986](http://www.ietf.org/rfc/rfc3986.txt)などを参照されると良いと思います。

URLの構造について、回答に必要な最小限を説明すると、以下のようになっています。

[code]

    [schema]://[host]/[path]
    
[/code]

URLはURIの一種で、インターネット上のリソースであることを示します。スキーム部には通信に使うプロトコルを記述します。`http://`であればhttpプロトコルで通信を行います。ホスト部はリソースを提供するホストマシン名を記述します。

そして、ホストマシンに対して「何のリソースを要求するのか？」を示すのがパス部です。見慣れたインターネットアドレスはパス部が階層的になっていると思います。

[code]

    http://www.example.com/segment1/segment2/segment3
    
[/code]

パス部は上の階層から順に、「第1セグメント」「第2セグメント」…と呼ばれます。`getLastPathSegment()`は最後のセグメントを取得するので、ここでは`segment3`を返します。

またこのとき、URLデコードを行います。URLは仕様上使える文字種が規定されています。使用できない文字をURLに含める場合には、パーセントエンコーディングによる符号化を行います。デコードはその逆の処理で、符号化した文字列を元の文字列に復号します。

* * *

`matches(articleRegex)`は正規表現のマッチング処理です。取得したセグメントが数字として表現可能かどうかの判定を行っています。

エラーについては情報が不足しています。どのようなURLで、何のエラーが起きるのか明記しないと発生条件は分かりません。`getLastPathSegment()`はパス部のないURLを渡した場合に`null`が返却されますが、それを考慮していないコードですので、`NullPointerException`が発生しえますが、あくまで推測です。


CC BY-SA 3.0
2015-09-04T12:34:58.547
16258
2015-09-04T12:34:58.547
5337
16249
answer