Javaで文字列置換メソッドを使用しているときに問題に直面する

女性

Kindleデバイスでの通知のサポートに取り組んでいます。トピックを含む式stingをサーバーから受け取ります(トピックは一重引用符で囲みます)。デバイスがトピックにサブスクライブされているかどうかを確認する必要があります。サブスクライブされている場合は、論理式のトピックを「1」に置き換える必要があります。それ以外の場合は「0」に置き換える必要があります。以下は、論理式がどのように見えるかの例です。

('18' in topics || '4' in topics) && ('REG_92779' in topics && 'REG_91212' in topics)

デバイスがトピック「18」、「4」にサブスクライブされてお​​り、「REG_92779」および「REG_91212」にサブスクライブされていないと想定します。式は次のようになります

('1' || '1') && ('0' && '0')

その後、スペースと引用符を削除する必要があります。式は次のようになります

(1||1)&&(0&0)

以下はコードです

private boolean checkNotificationValid(String leString) {
        // Remove the 'in topics' string. examples of logical expression as below
        // ('4' in topics && '50000' in topics) || ('60' in topics || '3' in topics)
        // ('4' in topics && ('50000' in topics || '60' in topics))
        leString = leString.replaceAll("in topics", "");
        Log.d(TAG, "Notifications : ADM : LE : Logical Expression received : " + leString);
        boolean result = false;

        // Find the topics in the logical expression and check whether the device is subscribed to
        // the topic. If device is subscribed to the topic, replace the topic with 1 or replace the
        // topic with 0. Below is the example.
        // Assume device is subscribed to topics 3 and 4.
        // Expression : ('4' && '50000') || ('60' || '3')
        // After this block of code, it becomes : ('1' && '0') || ('0' || '1')
        Pattern p = Pattern.compile("'(.*?)'");
        Matcher m = p.matcher(leString);
        while(m.find()) {
            Log.d(TAG, "Notifications : ADM : LE : " + m.group(1));

            // Check whether the device is subscribed to the topic
            if(NotificationUtils.isTopicExistInSharedPref(m.group(1))) {
                leString = leString.replaceFirst(m.group(1), "1");
            } else {
                leString = leString.replaceFirst(m.group(1), "0");
            }
        }

        // Remove the quotes and spaces from the string, replace '||' with '|', replace '&&' with '&'
        // ('1' && '0') || ('0' || '1') -> (1&0)|(0|1)
        leString = leString.replaceAll("[' ]", "");
        leString = leString.replaceAll("\\|\\|", "|");
        leString = leString.replaceAll("&&", "&");

        return result;
    }

コードは正常に機能しています。ただし、トピックが「1」または「0」の場合、失敗しています。以下は例です、

('18' in topics || '4' in topics) && ('1' in topics && '1' in topics)

最初の2つのトピック(18と4)の検証後、文字列は次のようになります。

('1' || '1') && ('1' && '1')

トピック「1」について、0に置き換えようとすると(デバイスがサブスクライブされていないため)、最初の「1」が置き換えられ、3番目の「1」が置き換えられます。以下のようになります。

('0' || '1') && ('1' && '1')

なるはずです

('1' || '1') && ('0' && '1')

トピック「0」でも同じ問題が発生しています。

これは、replaceFirst()メソッドを使用したために発生しています。replace()を使おうとすると、特定のトピックを置き換えるのではなく、文字列内のすべてのオカレンスを置き換えます。誰かがこの問題を解決する方法を教えてもらえますか?

注:最初にデバイスのサブスクリプションに基づいて1または0に置き換えましたが、トピックを1または0の引用符に置き換える方法がわからなかったため、後で引用符( '4'-> '1'-> 1)を削除しました( '4'-> 1)。

b。ギラス

代わりに使用するreplaceFirstStringは、使用することができますStringBufferし、追加置換appendReplacementする方法をMatcher

コードは次のようになります。

private boolean checkNotificationValid(String leString) {
    leString = leString.replaceAll("in topics", "");
    Log.d(TAG, "Notifications : ADM : LE : Logical Expression received : " + leString);
    boolean result = false;

    StringBuffer buffer = new StringBuffer();
    Pattern p = Pattern.compile("'(.*?)'");
    Matcher m = p.matcher(leString);
    while(m.find()) {
        Log.d(TAG, "Notifications : ADM : LE : " + m.group(1));

        if(NotificationUtils.isTopicExistInSharedPref(m.group(1))) {
            m.appendReplacement(buffer, "1");
        } else {
            m.appendReplacement(buffer, "0");
        }
    }

    m.appendTail(buffer);
    String finalStr = buffer.toString();
    finalStr = finalStr.replaceAll("[' ]", "");
    finalStr = finalStr.replaceAll("\\|\\|", "|");
    finalStr = finalStr.replaceAll("&&", "&");

    return result;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Python3.4.4を使用してデータフレーム内の文字列の部分文字列を置き換える際の問題に直面しています

分類Dev

vbscriptを使用してファイル内の文字列を置き換える際の問題に直面しています

分類Dev

forEach()メソッドを使用して、リスト内のすべての文字列を同等の大文字に置き換えることは可能ですか?

分類Dev

reactjsのメソッドにパラメーターを渡す際の問題に直面している

分類Dev

空の文字列に置き換えずに文字列置換メソッドを使用するにはどうすればよいですか?

分類Dev

怠惰なseq問題に直面しているClojureで文字列を分割しようとしています

分類Dev

SQLクエリでANDを使用して「<」記号を使用しているときに直面する問題

分類Dev

replaceメソッドを使用せずにJavaで部分文字列を置き換えるにはどうすればよいですか?

分類Dev

フォームのgetメソッドを介して送信するときにURLのutf-8文字列で問題が発生する

分類Dev

列の非表示と表示の機能に基づいて列ヘッダーの問題に直面しているangularJsでag-gridを使用する

分類Dev

Replaceメソッドを使用すると文字列が置き換えられないのはなぜですか?

分類Dev

Javaは、置換する代わりに置換文字列を追加するすべてのメソッドを置換します

分類Dev

Javascript Stringオブジェクトにメソッドを追加すると、文字列が新しい文字列に置き換えられます

分類Dev

私がubuntuのスイングコードでDJブラウザを使用しているときにlibwebkitgtkの問題に直面しています

分類Dev

UbuntuにMACOSVMWAREをダウンロードし、Xcodeを実行しているときに直面する問題

分類Dev

`replace`メソッドを使用して整数をリストに置き換えることができないのはなぜですか-パンダ

分類Dev

Pandasの関数を使用して列内のNaNを置き換えるときに、インデックスが範囲外に直面しているエラー

分類Dev

AJAXとPHPを使用してユーザーレコードを削除するときに直面する問題

分類Dev

角度で@viewchildを呼び出しているときに問題に直面しています

分類Dev

Pythonの.replaceメソッドを介して文字列を他の文字列に置き換える方法は?

分類Dev

java replaceメソッドを使用して文字列内の文字を置き換える

分類Dev

文字列をメソッド値に置き換える方法は?

分類Dev

Debug.WriteLineを使用して、ポートに書き込まれている内容を表示しようとしています。エラー「引数1:「メソッドグループ」から「文字列」に変換できません」を取得しています

分類Dev

toString()メソッドを使用してdisplayメソッドを置き換えるにはどうすればよいですか?

分類Dev

メソッドreplaceAllを使用してJava文字列内のテキストのすべてのインスタンスを置き換えることに関するアドバイス

分類Dev

C#で文字列操作を実行する際の問題に直面している

分類Dev

JavaScriptを使用してバックスラッシュを文字列に置き換えるにはどうすればよいですか?!(別の質問)

分類Dev

画像/配列内のセグメントのリストにskimage.filters.threshold_otsu()を適用するためにPythonでforループを使用しているときに問題に直面する

分類Dev

文字列を等しいメソッドと文字列を数値に変換する方法を連携させることはできません。

Related 関連記事

  1. 1

    Python3.4.4を使用してデータフレーム内の文字列の部分文字列を置き換える際の問題に直面しています

  2. 2

    vbscriptを使用してファイル内の文字列を置き換える際の問題に直面しています

  3. 3

    forEach()メソッドを使用して、リスト内のすべての文字列を同等の大文字に置き換えることは可能ですか?

  4. 4

    reactjsのメソッドにパラメーターを渡す際の問題に直面している

  5. 5

    空の文字列に置き換えずに文字列置換メソッドを使用するにはどうすればよいですか?

  6. 6

    怠惰なseq問題に直面しているClojureで文字列を分割しようとしています

  7. 7

    SQLクエリでANDを使用して「<」記号を使用しているときに直面する問題

  8. 8

    replaceメソッドを使用せずにJavaで部分文字列を置き換えるにはどうすればよいですか?

  9. 9

    フォームのgetメソッドを介して送信するときにURLのutf-8文字列で問題が発生する

  10. 10

    列の非表示と表示の機能に基づいて列ヘッダーの問題に直面しているangularJsでag-gridを使用する

  11. 11

    Replaceメソッドを使用すると文字列が置き換えられないのはなぜですか?

  12. 12

    Javaは、置換する代わりに置換文字列を追加するすべてのメソッドを置換します

  13. 13

    Javascript Stringオブジェクトにメソッドを追加すると、文字列が新しい文字列に置き換えられます

  14. 14

    私がubuntuのスイングコードでDJブラウザを使用しているときにlibwebkitgtkの問題に直面しています

  15. 15

    UbuntuにMACOSVMWAREをダウンロードし、Xcodeを実行しているときに直面する問題

  16. 16

    `replace`メソッドを使用して整数をリストに置き換えることができないのはなぜですか-パンダ

  17. 17

    Pandasの関数を使用して列内のNaNを置き換えるときに、インデックスが範囲外に直面しているエラー

  18. 18

    AJAXとPHPを使用してユーザーレコードを削除するときに直面する問題

  19. 19

    角度で@viewchildを呼び出しているときに問題に直面しています

  20. 20

    Pythonの.replaceメソッドを介して文字列を他の文字列に置き換える方法は?

  21. 21

    java replaceメソッドを使用して文字列内の文字を置き換える

  22. 22

    文字列をメソッド値に置き換える方法は?

  23. 23

    Debug.WriteLineを使用して、ポートに書き込まれている内容を表示しようとしています。エラー「引数1:「メソッドグループ」から「文字列」に変換できません」を取得しています

  24. 24

    toString()メソッドを使用してdisplayメソッドを置き換えるにはどうすればよいですか?

  25. 25

    メソッドreplaceAllを使用してJava文字列内のテキストのすべてのインスタンスを置き換えることに関するアドバイス

  26. 26

    C#で文字列操作を実行する際の問題に直面している

  27. 27

    JavaScriptを使用してバックスラッシュを文字列に置き換えるにはどうすればよいですか?!(別の質問)

  28. 28

    画像/配列内のセグメントのリストにskimage.filters.threshold_otsu()を適用するためにPythonでforループを使用しているときに問題に直面する

  29. 29

    文字列を等しいメソッドと文字列を数値に変換する方法を連携させることはできません。

ホットタグ

アーカイブ