Am'm încercarea de a crea o expresie regulată pentru potrivire latitudine/longitudine. Pentru indeplinesc un dublu-precizie numărul I'am folosit (\-?\d+(\.\d+)?)
, și a încercat să combine într-o singură expresie:
^(\-?\d+(\.\d+)?),\w*(\-?\d+(\.\d+)?)$
Am așteptat acest lucru pentru a se potrivi un pat dublu, o virgulă, poate puțin spațiu, și un alt dublu, dar nu't par să funcționeze. În mod special aceasta funcționează numai dacă nu's NICI un spațiu, nu una sau mai multe. Ce am făcut greșit?
Acesta va corespunde strict latitudine și longitudine valori care se încadrează în intervalul corect:
^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$
Meciuri
Nu't de Meci
Eu sunt, folosind acestea (format zecimal, cu 6 cifre zecimale):
^(\+|-)?(?: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})?))$
Aici este o esență care testează atât, raportat aici, de asemenea, pentru a facilita accesul. L's un Java TestNG test. Ai nevoie de Slf4j, Hamcrest și Lombok să-l rulați:
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;
}
}
}
De fapt Alix Axel, mai presus de regex este greșit în latitudine, longitudine variază punct de vedere.
Latitudine măsurători variază de la -90° pana la +90° Longitudine măsurători variază de la -180° la +180°
Deci regex dat mai jos validează cu mai multă precizie. De asemenea, ca pe gândul meu nimeni nu ar trebui să limiteze punctul zecimal în latitudine/longitudine.
^([-+]?\d{1,2}([.]\d+)?),\s*([-+]?\d{1,3}([.]\d+)?)$
SAU pentru Obiectiv C
^([-+]?\\d{1,2}([.]\\d+)?),\\s*([-+]?\\d{1,3}([.]\\d+)?)$
^-?[0-9]{1,3}(?:\.[0-9]{1,10})?$
Regex defalcare:
^-?[0-9]{1,3}(?:\.[0-9]{1,10})?$
-?
# accepta valori negative
^
# Începe de string
[0-9]{1,3}
# Meci 1-3 cifre (am. e. 0-999)
(?:
# Încercați să se potrivească...
\.
# un punct zecimal
[0-9]{1,10}
# urmat de unul la 10 cifre (am. e. 0-9999999999)
)?
# opțional ...
$
# Sfârșitul șirului
Încercați acest lucru:
^(\()([-+]?)([\d]{1,2})(((\.)(\d+)(,)))(\s*)(([-+]?)([\d]{1,3})((\.)(\d+))?(\)))$
Verifica la:
Inserați o expresie în caseta de sus, apoi pune astfel de lucruri în caseta de jos:
(80.0123, -34.034)
(80.0123)
(80.a)
(980.13, 40)
(99.000, 122.000)
Regex defalcare:
^ # 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).
Acum, ceea ce NU face este să se limiteze la acest interval:
(-90 to +90, and -180 to +180)
În schimb, acesta simplu se limitează la aceasta gama:
(-99 to +99, -199 to +199)
Dar ideea este, în principal, doar pentru a rupe în jos fiecare bucată de exprimare.
Python:
Latitudine: rezultat = re.meci("^[+-]?((90.?0$)|(([0-8]?[0-9]).?[0-9]$))", '-90.00001')`
Longitudine: rezultat = re.meci("^[+-]?((180.?0$)|(((1[0-7][0-9])|([0-9]{0,2})).?[0-9]$))", '-0.0000')`
Latitudine ar trebui să eșueze în exemplu.
Te cred're folosind \w (word caracter) în cazul în care ar trebui să fie folosind \s (spațiu). Cuvântul caractere constau de obicei de [A-Za-z0-9_], astfel încât exclude spațiu, care apoi în continuare nu reușește să se potrivi pe opțională semnul minus sau o cifră.
@macro-ferrari am găsit o cale să-l scurteze, și fără a uita-te aheads în lumina recentelor discuții despre regex motoarele
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})?)$/;
O completă și simplă metodă obiectivă de C pentru verificarea model corect pentru latitudine și longitudine este:
-( 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;
}
unde searchedString este o intrare care utilizator ar putea intra în respectivul text.
Aici este PHP's version (valorile de intrare sunt: $latitude " și " $longitudine
):
$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.
}
Puteți încerca acest lucru:
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})?$/;
Încercați acest lucru:
^[-+]?(([0-8]\\d|\\d)(\\.\\d+)?|90(\\.0+)?)$,\s*^[-+]?((1[0-7]\\d(\\.\\d+)?)|(180(\\.0+)?)|(\\d\\d(\\.\\d+)?)|(\\d(\\.\\d+)?))$
Încercați acest lucru:
(?<!\d)([-+]?(?:[1-8]?\d(?:\.\d+)?|90(?:\.0+)?)),\s*([-+]?(?:180(?:\.0+)?|(?:(?:1[0-7]\d)|(?:[1-9]?\d))(?:\.\d+)?))(?!\d)`