অক্ষাংশ / দ্রাঘিমাংশ স্থানাঙ্কগুলির সাথে মেলে নিয়মিত প্রকাশ?


149

আমি অক্ষাংশ / দ্রাঘিমাংশ স্থানাঙ্কগুলির সাথে মিলে যাওয়ার জন্য একটি নিয়মিত প্রকাশ তৈরি করার চেষ্টা করছি। ডাবল-স্পষ্টতা সংখ্যার সাথে আমি ব্যবহার করেছি (\-?\d+(\.\d+)?)এবং এটি একটি একক অভিব্যক্তিতে সংযুক্ত করার চেষ্টা করেছি :

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

আমি এটি একটি ডাবল, একটি কমা, সম্ভবত কিছু স্থান এবং অন্য একটি ডাবল মিলবে বলে আশাবাদী, তবে এটি কার্যকর হবে বলে মনে হচ্ছে না। বিশেষত এটি কেবল তখনই কাজ করে যদি এক বা একাধিক জায়গা না থাকে। আমি কি ভুল করেছি?

উত্তর:


117

শ্বেত স্পেস \ গুলি, \ ডাব্লু নয়

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

এটি কাজ করে কিনা দেখুন


1
আমাকে কমা: /^(\-?\d+(\.\d+) এর পরিবর্তে বিন্দু ব্যবহার করতে হবে?) এখানে অ্যাডট করুন। endMod \ s * (\ -? \ d + (\। \ d +)?) $ /
কলোডি

এটি ল্যাটস এবং লম্বাগুলির জন্য অনুমোদিত রেঞ্জের পাশের মানগুলিকে গ্রহণ করে। উদাহরণস্বরূপ, 91,181
অরুণ

এটি প্রজেক্টেড স্পেসিয়াল রেফারেন্স সিস্টেমগুলির এক্স / ওয়াই-স্থানাঙ্কের জন্যও কাজ করে
Degeg

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

এটা সত্যিই দারুন. পরিসীমা চেক অন্তর্ভুক্তির জন্য কুডোস।
Radj

1
আমি মনে করি আপনার প্রথম ম্যাচের উদাহরণে একটি টাইপ আছে। আমি সন্দেহ করি যে RegEx 3 টি মানের সাথে মিলবে।
বুখার্ড

সংশোধন করা হয়েছে। এটি দুটি পৃথক উদাহরণ হতে বোঝানো হয়েছিল।
আইইন ফ্রেজার 3

7
কমাটির উভয় পক্ষেই সাদা-স্থান গ্রহণ করতে সংশোধিত: ^ [- +]? ([1-8]? \ D (\। \ D +)? | 90 (0। 0 +)?) * S *, \ s * [- +]? (180 (\। 0 +)? | ((1 [0-7] \ d) | ([1-9]? \ d)) (\। \ d +)?) $
পদ্মানমান 13

2
আমি ক্যাপচারিং গ্রুপগুলিতে ?:নন ক্যাপচারিং গ্রুপ সিনট্যাক্স, পাশাপাশি ক্যাপচারিটি ব্যবহার করে ক্যাপচারিং গ্রুপগুলিতে ঠিক সেই ল্যাট লোন পেতে এই পরিবর্তন করেছি(^[-+]?(?:[1-8]?\d(?:\.\d+)?|90(?:\.0+)?)),\s*([-+]?(?:180(?:\.0+)?|(?:(?:1[0-7]\d)|(?:[1-9]?\d))(?:\.\d+)?))$
নর্থার ১৫77

109

আমি এইগুলি ব্যবহার করছি (dec দশমিক অঙ্ক সহ দশমিক বিন্যাস):

অক্ষাংশ

^(\+|-)?(?: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})?))$

দ্রাঘিমাংশ নিয়মিত প্রকাশের ভিজ্যুয়ালাইজেশন


এখানে একটি সারকথা উভয় পরীক্ষা এখানে রিপোর্ট, অ্যাক্সেস কর্মের জন্য। এটি একটি জাভা টেস্টএনজি পরীক্ষা। এটি চালানোর জন্য আপনার দরকার Slf4j, হামক্রস্ট এবং লম্বোক:

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

এটি ছিল সত্যিই চমৎকার রেজেেক্স! তবে এটাকে কি আর কিছুটা ছোট করা সম্ভব? :) এটি যদি না পারে তবে এটি
ওকি

@ এরিক এডগ্রেন আমি এটি সংক্ষিপ্ত করার কোনও উপায় খুঁজে পাইনি :(
মার্কো ফেরারি

1
ঠিক আছে: / ওহ ভাল। আপনার রেজেক্স এখনও দুর্দান্ত
esome

2
দুর্দান্ত ভিজ্যুয়াল: ডি এই ওয়েবসাইটটি সম্পর্কে জানতেন না! ধন্যবাদ !
দামিই

ওয়েবসাইট ইউআরএল কী
কে - এসও-তে বিষক্রিয়া বাড়ছে।

19

প্রকৃতপক্ষে অ্যালিক্স অ্যাক্সেল, উপরের রেজেক্সটি অক্ষাংশে ভুল, দ্রাঘিমাংশ বিন্যাসের দৃষ্টিকোণে রয়েছে।

অক্ষাংশের পরিমাপ –90 from থেকে + 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এবং তাই অবৈধ।
ako

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

রেজেক্স ব্রেকডাউন:

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

-? # নেতিবাচক মান গ্রহণ করুন

^ # স্ট্রিংয়ের শুরু

[0-9]{1,3} # ম্যাচ ১-২ সংখ্যা (অর্থাত- ০-৯৯৯)

(?: # মিলানোর চেষ্টা করুন ...

\. # দশমিক পয়েন্ট

[0-9]{1,10} # এক থেকে 10 সংখ্যার পরে (যেমন 0-9999999999)

)? # ... allyচ্ছিকভাবে

$ # স্ট্রিং এর সমাপ্তি


আমি মনে করি আপনার সবচেয়ে মার্জিত। প্রথমত, এটি অবিলম্বে অক্ষরগুলি সম্পাদনা ও প্রতিস্থাপন না করে অবিলম্বে কাজ করে। দ্বিতীয়ত, এটি সংক্ষিপ্ত। তৃতীয়ত, এটি বোঝা সহজ।
জিম রোটা

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 first প্রথমে আসবে, তারপরে {1,3}
র‌্যাডনেল

@ আরজান: স্থির, আমি সবসময় দুজনকে বিভ্রান্ত করি। ধন্যবাদ!
অ্যালিক্স অ্যাক্সেল

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

এখানে চিত্র বর্ণনা লিখুন


সুন্দর ব্যাখ্যা, আপনি কীভাবে কোনও নির্দিষ্ট সফ্টওয়্যার ব্যবহার করেছেন তা এই প্রবাহকে কীভাবে নিয়ন্ত্রণ পেতে পারেন তা বিটিডব্লিউ। এই এক regexper.com ?
সাইলেন্টসো

3

আমি বিশ্বাস করি আপনি \ ডাব্লু (শব্দের চরিত্র) ব্যবহার করছেন যেখানে আপনার ought গুলি (সাদা স্থান) ব্যবহার করা উচিত। শব্দের অক্ষরগুলিতে সাধারণত [A-Za-z0-9_] থাকে, যাতে আপনার স্থান বাদ যায় যা পরে theচ্ছিক বিয়োগ চিহ্ন বা একটি অঙ্কের সাথে মিলতে ব্যর্থ হয়।


3

এটি এর মতো ফর্ম্যাটের জন্য কাজ করবে: 31 ͦ 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

অক্ষাংশ এবং দ্রাঘিমাংশের সঠিক প্যাটার্ন পরীক্ষা করার জন্য উদ্দেশ্য সি এর একটি সম্পূর্ণ এবং সহজ পদ্ধতি হ'ল:

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

যেখানে অনুসন্ধানের স্ট্রিং হ'ল ইনপুট যা ব্যবহারকারী স্ব স্ব পাঠ্যক্ষেত্রের মধ্যে প্রবেশ করবে।


0

পিএইচপি

এখানে পিএইচপি এর সংস্করণ (ইনপুট মানগুলি: $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
খাঁটি কোডের উত্তরগুলি খুব কমই ভাল ধারণা। দয়া করে আপনার উত্তরে কিছু বর্ণনামূলক পাঠ্য যুক্ত করুন।
টিমক্লুটটন

দুর্দান্ত কাজ করে: নিখুঁতভাবে বৈধতা দেয় এবং আশেপাশের কোনও পাঠ্য থেকে দীর্ঘ, ল্যাটকে আনে। তবে, দশমিক বিন্দু পরে এটি যে উল্লেখযোগ্য অঙ্কের অনুমতি দেয় তা সীমাবদ্ধ করে না।
ব্যবহারকারী 4325241
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.