अक्षांश / देशांतर निर्देशांक के मिलान के लिए नियमित अभिव्यक्ति?


149

मैं अक्षांश / देशांतर निर्देशांक मिलान के लिए एक नियमित अभिव्यक्ति बनाने की कोशिश कर रहा हूँ। मेरे द्वारा उपयोग किए गए दोहरे-सटीक संख्या से मेल खाने के लिए (\-?\d+(\.\d+)?), और उसे एक एकल अभिव्यक्ति में संयोजित करने का प्रयास किया गया है:

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

मुझे उम्मीद थी कि यह एक डबल, एक अल्पविराम, शायद कुछ स्थान और एक और डबल से मेल खाएगा, लेकिन यह काम नहीं करता है। विशेष रूप से यह केवल तभी काम करता है जब कोई स्थान न हो, एक या अधिक नहीं। मैंने क्या गल्त किया है?

जवाबों:


117

व्हॉट्सएप \ _ नहीं, डब्ल्यू है

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

देखें कि क्या यह काम करता है


1
मुझे अल्पविराम के बजाय डॉट का उपयोग करना था: / ^(----dd+(\.\d+);) यहाँ। EndMod \ s * (\ -? d + (\
_

यह मानों को अक्षांश और देशांतर के लिए अनुमत सीमा से बाहर स्वीकार करता है। जैसे, 91,181
अरुण

यह अनुमानित स्पैटियल रेफरेंस सिस्टम के x / y-निर्देशांक के लिए भी काम करता है
DeEgge

218

यह कड़ाई से अक्षांश और देशांतर मूल्यों से मेल खाएगा जो सही सीमा के भीतर आते हैं:

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

माचिस

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

मेल नहीं खाता

  • -90, -180।
  • +90.1, -100.111
  • -91, 123.456
  • 045, 180

यह कमाल का है। रेंज की जाँच में शामिल करने के लिए यश।
राड

1
मुझे लगता है कि आपके पास अपने पहले मैचों के उदाहरण में एक टाइपो है। मुझे संदेह है कि RegEx 3 मूल्यों से मेल खाएगा।
बुर्खर्ड

फिक्स्ड। यह दो अलग-अलग उदाहरणों के लिए था।
इयेन फ्रेजर

7
अल्पविराम के दोनों किनारों पर सफेद-स्थान को स्वीकार करने के लिए संशोधित: ^ [- +]? ([1-8]? और डी (\। \ D +)? - 90 (\ _ 0 +)?) \ S *, \ _। s * [- +]? (180 (\ _। + +)? ((1 [4-7] \ d) - ([1-9]? (d)) (\ _। d +)?) $
puddinman13

2
मैंने इसे केवल ?:कैप्चरिंग ग्रुप सिंटैक्स का उपयोग करके कैप्चरिंग समूहों में लेट लोन प्राप्त करने के लिए बदल दिया , साथ ही पोलरिटी पर भी कब्जा कर लिया(^[-+]?(?:[1-8]?\d(?:\.\d+)?|90(?:\.0+)?)),\s*([-+]?(?:180(?:\.0+)?|(?:(?:1[0-7]\d)|(?:[1-9]?\d))(?:\.\d+)?))$
narthur157

109

मैं इनका उपयोग कर रहा हूँ (दशमलव प्रारूप, 6 दशमलव अंकों के साथ):

अक्षांश

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

अक्षांश नियमित अभिव्यक्ति दृश्य

देशान्तर

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

देशांतर नियमित अभिव्यक्ति दृश्य


यहां एक जिस्ट है जो दोनों का परीक्षण करता है, यहां तक ​​आसानी से पहुंचने के लिए रिपोर्ट किया गया है। यह Java TestNG टेस्ट है। इसे चलाने के लिए आपको Slf4j, Hamcrest और लंबोक की जरूरत है:

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 <= 90.0){
            boolean result = df.format(latitudeToTest).matches(LATITUDE_PATTERN);
            log.info("Latitude: tested {}. Result (matches regex): {}", df.format(latitudeToTest), result);
            assertThat(result, is(true));
            latitudeToTest += step;
        }

        latitudeToTest = -90.1;

        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 <= 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;
        }
    }

    @Test
    public void longitudeTest(){
        DecimalFormat df = new DecimalFormat("#.######");
        df.setRoundingMode(RoundingMode.UP);
        double step = 0.01;
        Double longitudeToTest = -180.0;

        while(longitudeToTest <= 180.0){
            boolean result = df.format(longitudeToTest).matches(LONGITUDE_PATTERN);
            log.info("Longitude: tested {}. Result (matches regex): {}", df.format(longitudeToTest), result);
            assertThat(result, is(true));
            longitudeToTest += step;
        }

        longitudeToTest = -180.01;

        while(longitudeToTest >= -300.0){
            boolean result = df.format(longitudeToTest).matches(LONGITUDE_PATTERN);
            log.info("Longitude: tested {}. Result (matches regex): {}", df.format(longitudeToTest), result);
            assertThat(result, is(false));
            longitudeToTest -= step;
        }

        longitudeToTest = 180.01;

        while(longitudeToTest <= 300.0){
            boolean result = df.format(longitudeToTest).matches(LONGITUDE_PATTERN);
            log.info("Longitude: tested {}. Result (matches regex): {}", df.format(longitudeToTest), result);
            assertThat(result, is(false));
            longitudeToTest += step;
        }
    }
}

यह एक बहुत अच्छा regex था! लेकिन क्या इसे थोड़ा कम करना संभव है? :) अगर यह नहीं हो सकता है, यह ठीक है, लेकिन छोटे कोड का हमेशा स्वागत है :)
Airikr

@ ErikEdgren मुझे इसे छोटा करने का कोई तरीका नहीं मिला :(
मार्को फेरारी

1
ठीक है: / ओह। आपका रेगेक्स अभी भी कमाल का है;)
२१:३५ पर एयरिकर

2
अच्छा दृश्य: D इस वेबसाइट के बारे में नहीं जानता था! धन्यवाद !
Damiii


19

वास्तव में एलिक्स एक्सल, ऊपर रेगेक्स अक्षांश में गलत है, देशांतर पर्वतमाला बिंदु है।

अक्षांश माप -90 ° से + 90 ° देशांतर माप सीमा -180 ° से + 180 ° तक होता है

तो नीचे दिया गया रेगेक्स अधिक सटीक रूप से मान्य होता है।
इसके अलावा, मेरे विचार के अनुसार किसी को भी अक्षांश / देशांतर में दशमलव बिंदु को प्रतिबंधित नहीं करना चाहिए।

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

या उद्देश्य सी के लिए

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

2
यह स्वीकार करता 99है Latitude, जबकि 99इसकी सीमा से बाहर है -90, +90और इसलिए अमान्य है।
एको

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

रेगेक्स ब्रेकडाउन:

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

-? # नकारात्मक मूल्यों को स्वीकार करें

^ # स्ट्रिंग शुरू करें

[0-9]{1,3} # मैच 1-3 अंकों (यानी 0-999)

(?: # मिलान करने का प्रयास करें ...

\. # एक दशमलव बिंदु

[0-9]{1,10} # इसके बाद एक से 10 अंक (यानी 0-9999999999)

)? # ... वैकल्पिक रूप से

$ # स्ट्रिंग का अंत


मुझे लगता है कि तुम्हारा सबसे सुंदर है। सबसे पहले, यह भागने के पात्रों को संपादित करने और बदलने के बिना तुरंत काम किया। दूसरे, यह छोटा है। तीसरा, यह समझना आसान है।
जिम रोटा

9

इसे इस्तेमाल करे:

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

इसे बाहर की जाँच करें:

http://regexpal.com/

शीर्ष बॉक्स में अभिव्यक्ति पेस्ट करें, फिर नीचे बॉक्स में इस तरह की चीजें डालें:

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

रेगेक्स ब्रेकडाउन:

^                    # 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).

अब, यह क्या नहीं करता है खुद को इस सीमा तक सीमित है:

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

इसके बजाय, यह सरल इस सीमा तक ही सीमित है:

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

लेकिन बिंदु मुख्य रूप से अभिव्यक्ति के प्रत्येक टुकड़े को तोड़ने के लिए है।


7

यहाँ एक और अधिक सख्त संस्करण है:

^([-+]?\d{1,2}[.]\d+),\s*([-+]?\d{1,3}[.]\d+)$
  • अक्षांश = -90-+90
  • देशांतर = -180-+180

1
मेरा मानना ​​है कि {1,2} पहले आना चाहिए, फिर {1,3}
randunel

@ अर्जन: फिक्स्ड, मैं हमेशा दोनों को भ्रमित करता हूं। धन्यवाद!
एलिक्स एक्सल

5

अजगर:

अक्षांश: result = re.match("^[+-]?((90\.?0*$)|(([0-8]?[0-9])\.?[0-9]*$))", '-90.00001')

देशांतर: result = re.match("^[+-]?((180\.?0*$)|(((1[0-7][0-9])|([0-9]{0,2}))\.?[0-9]*$))", '-0.0000')

उदाहरण में अक्षांश विफल होना चाहिए।


4

@ मैक्रो-फ़ेरारी मुझे इसे छोटा करने का एक तरीका मिला, और बगैर इंजन के बारे में हाल ही में हुई बातचीत के आलोक में आहेद

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})?)$/;

यहाँ छवि विवरण दर्ज करें


अच्छा विवरण, btw कि कैसे यू इस प्रवाह नियंत्रण किसी भी विशिष्ट सॉफ्टवेयर यू इस्तेमाल किया मिलता है। यह एक regexper.com ?
साइलंट्सडो

3

मेरा मानना ​​है कि आप \ w (शब्द चरित्र) का उपयोग कर रहे हैं जहाँ आपको \ _ (व्हाट्सएप) का उपयोग करना चाहिए। शब्द वर्ण में आमतौर पर [A-Za-z0-9_] शामिल होता है, जिससे आपका स्थान बाहर हो जाता है, जो तब वैकल्पिक माइनस साइन या एक अंक पर मेल करने में विफल रहता है।


3

यह इस तरह के प्रारूप के लिए काम करेगा: 31 like 37.4 'E

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

1

माणिक

देशांतर -179.99999999..180

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

अक्षांश -89.99999999..90

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

0

अक्षांश और देशांतर के लिए सही पैटर्न की जाँच के लिए उद्देश्य C में एक पूर्ण और सरल विधि है:

 -( 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;
}

जहां searchString वह इनपुट है जिसे उपयोगकर्ता संबंधित टेक्स्टफील्ड में दर्ज करेगा।


0

पीएचपी

यहाँ PHP का संस्करण है (इनपुट मान हैं: $latitudeऔर $longitude):

$latitude_pattern  = '/\A[+-]?(?:90(?:\.0{1,18})?|\d(?(?<=9)|\d?)\.\d{1,18})\z/x';
$longitude_pattern = '/\A[+-]?(?:180(?:\.0{1,18})?|(?:1[0-7]\d|\d{1,2})\.\d{1,18})\z/x';
if (preg_match($latitude_pattern, $latitude) && preg_match($longitude_pattern, $longitude)) {
  // Valid coordinates.
}

-1

आप यह कोशिश कर सकते हैं:

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})?$/;

-2

इसे इस्तेमाल करे:

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

-2

इसे इस्तेमाल करे:

(?<!\d)([-+]?(?:[1-8]?\d(?:\.\d+)?|90(?:\.0+)?)),\s*([-+]?(?:180(?:\.0+)?|(?:(?:1[0-7]\d)|(?:[1-9]?\d))(?:\.\d+)?))(?!\d)`

5
शुद्ध कोड उत्तर शायद ही कभी एक अच्छा विचार है। कृपया अपने उत्तर में कुछ वर्णनात्मक पाठ जोड़ें।
टाइमक्लेटन

महान काम करता है: सटीक रूप से मान्य होता है, और किसी भी आसपास के पाठ से लंबे समय तक लेट जाता है। हालाँकि, दशमलव बिंदु के बाद इसके द्वारा दिए जाने वाले महत्वपूर्ण अंकों की संख्या को सीमित नहीं करता है।
user4325241
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.