Regular expression untuk pencocokan garis lintang/garis bujur?

I'm mencoba untuk membuat regular expression untuk pencocokan lintang/bujur. Untuk pencocokan nomor presisi ganda I've digunakan (\-?\d+(\.\d+)?), dan mencoba untuk menggabungkan menjadi satu ungkapan:

^(\-?\d+(\.\d+)?),\w*(\-?\d+(\.\d+)?)$

Saya harapkan ini untuk pertandingan ganda, koma, mungkin beberapa ruang, dan lain ganda, tapi itu doesn't tampaknya bekerja. Secara khusus ini hanya bekerja jika ada's TIDAK ada ruang, tidak satu atau lebih. Apa yang telah saya lakukan salah?

Yang satu ini benar-benar akan cocok dengan lintang dan bujur nilai-nilai yang jatuh dalam kisaran yang tepat:

^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$

Pertandingan

  • +90.0, -127.554334
  • 45, 180
  • -90, -180
  • -90.000, -180.0000
  • +90, +180
  • 47.1231231, 179.99999999

Doesn't Pertandingan

  • -90., -180.
  • +90.1, -100.111
  • -91, 123.456
  • 045, 180
Komentar (6)
Larutan

Spasi adalah \s, tidak \w

^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$

Melihat apakah ini bekerja

Komentar (3)

Saya menggunakan orang-orang ini (format desimal, dengan 6 digit desimal):

Lintang

^(\+|-)?(?:90(?:(?:\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\.[0-9]{1,6})?))$

[![Latitude ekspresi Reguler visualisasi][1]][1]

Bujur

^(\+|-)?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$

[![Longitude ekspresi Reguler visualisasi][2]][2]


[Di sini][3] adalah sebuah inti yang menguji kedua, dilaporkan di sini juga, untuk kemudahan akses. It's Jawa TestNG tes. Anda perlu Slf4j, Hamcrest dan Lombok untuk menjalankannya:


import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.*;

import java.math.RoundingMode;
import java.text.DecimalFormat;

import lombok.extern.slf4j.Slf4j;

import org.testng.annotations.Test;

@Slf4j
public class LatLongValidationTest {

    protected static final String LATITUDE_PATTERN="^(\\+|-)?(?:90(?:(?:\\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\\.[0-9]{1,6})?))$";
    protected static final String LONGITUDE_PATTERN="^(\\+|-)?(?:180(?:(?:\\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\\.[0-9]{1,6})?))$";

    @Test
    public void latitudeTest(){
        DecimalFormat df = new DecimalFormat("#.######");
        df.setRoundingMode(RoundingMode.UP);
        double step = 0.01;
        Double latitudeToTest = -90.0;

        while(latitudeToTest = -200.0){
            boolean result = df.format(latitudeToTest).matches(LATITUDE_PATTERN);
            log.info("Latitude: tested {}. Result (matches regex): {}", df.format(latitudeToTest), result);
            assertThat(result, is(false));
            latitudeToTest -= step;
        }

        latitudeToTest = 90.01;

        while(latitudeToTest 
Komentar (10)

Sebenarnya Alix Axel, di atas regex adalah salah latitude, longitude berkisar point of view.

Pengukuran lintang berkisar dari -90° hingga +90° Bujur pengukuran berkisar dari -180° sampai +180°

Jadi regex yang diberikan di bawah ini memvalidasi lebih akurat. Juga, per saya pikir tidak ada yang harus membatasi titik desimal di lintang/bujur.

^([-+]?\d{1,2}([.]\d+)?),\s*([-+]?\d{1,3}([.]\d+)?)$

ATAU untuk Tujuan C

^([-+]?\\d{1,2}([.]\\d+)?),\\s*([-+]?\\d{1,3}([.]\\d+)?)$
Komentar (1)
^-?[0-9]{1,3}(?:\.[0-9]{1,10})?$

Regex rincian:

^-?[0-9]{1,3}(?:\.[0-9]{1,10})?$

-? # menerima nilai-nilai negatif

^ # Mulai dari string

[0-9]{1,3} # Pertandingan 1-3 digit (i. e. 0-999)

(?: # Cobalah untuk mencocokkan...

\. # titik desimal

[0-9]{1,10} # diikuti oleh satu sampai 10 digit (i. e. 0-9999999999)

)? # opsional ...

$ # Akhir string

Komentar (1)

Coba ini:

^(\()([-+]?)([\d]{1,2})(((\.)(\d+)(,)))(\s*)(([-+]?)([\d]{1,3})((\.)(\d+))?(\)))$

Check it out di:

http://regexpal.com/

Paste ekspresi di atas kotak, kemudian menempatkan hal-hal seperti ini di kotak bawah:

(80.0123, -34.034)
(80.0123)
(80.a)
(980.13, 40)
(99.000, 122.000)

Regex rincian:

^                    # The string must start this way (there can't be anything before). 
    (\()             # An opening parentheses (escaped with a backslash).
    ([-+]?)          # An optional minus, or an optional plus.
    ([\d]{1,2})      # 1 or 2 digits (0-9).
    (                # Start of a sub-pattern.
        (            # Start of a sub-pattern.
            (\.)     # A dot (escaped with a backslash).
            (\d+)    # One or more digits (0-9).
            (,)      # A comma.
        )            # End of a sub-pattern.
    )                # End of a sub-pattern.
    (\s*)            # Zero or more spaces.
    (                # Start of a sub-pattern.
        ([-+]?)      # An optional minus, or an optional plus. 
        ([\d]{1,3})  # 1 to 3 digits (0-9).
        (            # Start of a pattern.
            (\.)     # A dot (escaped with a backslash).
            (\d+)    # One or more digits (0-9).
        )?           # End of an optional pattern.
        (\))         # A closing parenthesis (escaped with a backkslash).
    )                # End of a pattern
$                    # The string must end this way (there can't be anything after).

Sekarang, apa ini TIDAK lakukan adalah membatasi dirinya untuk kisaran ini:

(-90 to +90, and -180 to +180)

Sebaliknya, itu sederhana membatasi dirinya untuk kisaran ini:

(-99 to +99, -199 to +199) 

Tapi intinya adalah terutama hanya untuk memecah setiap bagian dari ekspresi.

Komentar (0)

Di sini adalah yang lebih ketat versi:

^([-+]?\d{1,2}[.]\d+),\s*([-+]?\d{1,3}[.]\d+)$
  • Lintang = -90 -- +90
  • Bujur = -180 -- +180
Komentar (2)

Python:

Lintang: hasil = re.pertandingan("^[+-]?((90\.?0*$)|(([0-8]?[0-9])\.?[0-9]*$))", '-90.00001')

Bujur: hasil = re.pertandingan("^[+-]?((180\.?0*$)|(((1[0-7][0-9])|([0-9]{0,2}))\.?[0-9]*$))", '-0.0000')

Lintang harus gagal dalam contoh.

Komentar (0)

Saya percaya anda're menggunakan \w (kata karakter) di mana anda harus menggunakan \s (spasi). Kata karakter biasanya terdiri dari [A-Za-z0-9_], sehingga tidak termasuk ruang anda, yang kemudian lebih lanjut gagal untuk mencocokkan pada opsional tanda minus atau digit.

Komentar (0)

Ini akan bekerja untuk format seperti ini: 31 37.4' E

^[-]?\d{1,2}[ ]*ͦ[ ]*\d{1,2}\.?\d{1,2}[ ]*\x27[ ]*\w$
Komentar (0)

@makro-ferrari saya tidak menemukan cara untuk mempersingkat, dan tanpa melihat aheads dalam terang dari semua pembicaraan terakhir tentang regex mesin

const LAT_RE = /^[+-]?(([1-8]?[0-9])(\.[0-9]{1,6})?|90(\.0{1,6})?)$/;

const LONG_RE = /^[+-]?((([1-9]?[0-9]|1[0-7][0-9])(\.[0-9]{1,6})?)|180(\.0{1,6})?)$/;

Komentar (2)

Ruby

Bujur -179.99999999..180

/^(-?(?:1[0-7]|[1-9])?\d(?:\.\d{1,8})?|180(?:\.0{1,8})?)$/ === longitude.to_s

Lintang -89.99999999..90

/^(-?[1-8]?\d(?:\.\d{1,8})?|90(?:\.0{1,8})?)$/ === latitude.to_s
Komentar (0)

Lengkap dan metode sederhana dalam objective C untuk memeriksa pola yang benar untuk lintang dan bujur adalah:

 -( BOOL )textIsValidValue:(NSString*) searchedString
{
    NSRange   searchedRange = NSMakeRange(0, [searchedString length]);
    NSError  *error = nil;
    NSString *pattern = @"^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?),\\s*[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$";
    NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: pattern options:0 error:&error];
    NSTextCheckingResult *match = [regex firstMatchInString:searchedString options:0 range: searchedRange];
    return match ? YES : NO;
}

dimana searchedString input user tersebut akan masuk di masing-masing textfield.

Komentar (0)

PHP

Berikut adalah PHP's versi (masukan nilai: $lintang dan $bujur):


$latitude_pattern  = '/\A[+-]?(?:90(?:\.0{1,18})?|\d(?(?
Komentar (0)

Anda dapat mencoba ini:

var latExp = /^(?=.)-?((8[0-5]?)|([0-7]?[0-9]))?(?:\.[0-9]{1,20})?$/;
var lngExp = /^(?=.)-?((0?[8-9][0-9])|180|([0-1]?[0-7]?[0-9]))?(?:\.[0-9]{1,20})?$/;
Komentar (0)

Coba ini:

^[-+]?(([0-8]\\d|\\d)(\\.\\d+)?|90(\\.0+)?)$,\s*^[-+]?((1[0-7]\\d(\\.\\d+)?)|(180(\\.0+)?)|(\\d\\d(\\.\\d+)?)|(\\d(\\.\\d+)?))$
Komentar (0)
/(-?\d{1,2}[.]\d+)(?U:.*)(-?1?[0-8]?\d[.]\d+)/
Komentar (0)