1

パターン/マッチャーメソッドを使用して、ANDROIDの正規表現に夢中になっています。私はここ数日かなり失敗しています。そして、はい、私は直接の助けを求める前に助けを求めてSOを探していました。OK、これが取引です:私の着信ストリームは次のようになります

UTC単位の時間(HhMmSs):154653
ステータス(A = OK、V = KO):V
緯度:4428.2011
方向(N / S):N
経度:00440.5161
方向(E / W):W
ノット単位の速度:000.5
度単位の方向:342.8
UTCでの日付(DdMmAa):050407
磁気変動:
変動(E / W):
モード:A

今のところ必要なのは、緯度と経度の値だけです。

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

public class NmeaParser {
/**
 * Tag used for log messages
 */
public String nmeaData;
public String lat; //latitude
public String lon; //longitude

private static final String LOG_TAG = "NPGPS";



public String longitude, latitude;
//find the text pattern
public static final Pattern NMEA_PATTERN = Pattern.
            compile(
                    "\\d{6}" +
                    ":\\s\\D" +
                    "\\w+\\S\\s\\d{4}.\\d+" +
                    ":\\s\\D" +
                    "\\w+\\S\\s\\d{5}.\\d+" +
                    ":\\s\\D" +
                    "\\d{3}.\\d{1}" +
                    "\\d{3}.\\d{1}" +
                    "\\d{6}" +
                    ":\\s\\D" +
                    ":\\s\\D"
                    //".*" //this works as a test
                    );

public String parseNmeaSentence(String gpsSentence) {
        Matcher rmcMatcher = NMEA_PATTERN.matcher(gpsSentence);
        //Log.i(LOG_TAG, "dataNP: "+ rmcMatcher);
        if (rmcMatcher.find()) {
                //Log.d("Matcher", "PATTERN MATCHES!");
            //else
                //Log.d("MATCHER", "PATTERN DOES NOT MATCH!");
            //String time = rmcMatcher.group(1);
          latitude = rmcMatcher.group(3);
          nmeaData = latitude;

        }
            return nmeaData;
  }
}

そして私はこれらのエラーを受け取り続けます:

09-17 11:37:36.936: E/AndroidRuntime(8756): FATAL EXCEPTION: main
09-17 11:37:36.936: E/AndroidRuntime(8756): java.lang.NullPointerException
09-17 11:37:36.936: E/AndroidRuntime(8756):     at                 android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.AbsListView.obtainView(AbsListView.java:2058)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.ListView.onMeasure(ListView.java:1155)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.View.measure(View.java:12723)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.View.measure(View.java:12723)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.View.measure(View.java:12723)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.View.measure(View.java:12723)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.View.measure(View.java:12723)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.os.Looper.loop(Looper.java:137)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at android.app.ActivityThread.main(ActivityThread.java:4575)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at java.lang.reflect.Method.invokeNative(Native Method)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at java.lang.reflect.Method.invoke(Method.java:511)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-17 11:37:36.936: E/AndroidRuntime(8756):     at dalvik.system.NativeStart.main(Native Method)

明らかに、私はパターン/マッチャーメソッド内の正規表現構文を台無しにしています。どんな助けでもはっきりと感謝します。ありがとう!

4

1 に答える 1

1

トレースからandroid.widget.ArrayAdapter、コードにリソースが欠落しているように見えるので、これが続行できない本当の問題です。

正規表現を再確認してください。正規表現にキャプチャグループがなく、パターンが入力文字列と一致していません。

多くの式を使用する場合の最善のアプローチは、一度に1つまたは2つの式を一致させて、それらを最初に機能させることです。

緯度と経度のみが必要だったので、(再)開始するための正規表現コードは次のとおりです。

Pattern NMEA_PATTERN = Pattern.compile(
                ".*Latitude: (\\d{4}.\\d+).*" + 
                "Longitude: (\\d{5}.\\d+).*");
Matcher m = NMEA_PATTERN.matcher(gpsSentence);

if (m.matches()) {
    String latitude = m.group(1);
    String longitude = m.group(2);
    ...
}
于 2012-09-17T19:03:21.750 に答える