我正在尝试创建一个匹配纬度/经度坐标的正则表达式.为了匹配我使用过的双精度数(\-?\d+(\.\d+)?),并试图将它组合成一个表达式:
^(\-?\d+(\.\d+)?),\w*(\-?\d+(\.\d+)?)$
Run Code Online (Sandbox Code Playgroud)
我希望这匹配一个double,一个逗号,也许是一些空格,另一个是double,但它似乎不起作用.具体来说,它只有在没有空间而不是一个或多个空间时才有效.我做错了什么?
Iai*_*ser 194
这个将严格匹配落在正确范围内的纬度和经度值:
^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$
Run Code Online (Sandbox Code Playgroud)
火柴
不匹配
Eri*_*c C 111
空白是\ s,而不是\ w
^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$
Run Code Online (Sandbox Code Playgroud)
看看这是否有效
Mar*_*ari 95
我正在使用这些(十进制格式,带有6位十进制数字):
^(\+|-)?(?:90(?:(?:\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\.[0-9]{1,6})?))$
Run Code Online (Sandbox Code Playgroud)
^(\+|-)?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$
Run Code Online (Sandbox Code Playgroud)
这里有一个要点,它既可以测试,也可以在这里进行测试,以便于访问.这是一个Java TestNG测试.你需要Slf4j,Hamcrest和Lombok来运行它:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 19
实际上Alix Axel,在正则表达式上的纬度,经度范围的观点是错误的.
纬度测量范围为-90°至+ 90°经度测量范围为-180°至+ 180°
因此,下面给出的正则表达式可以更准确地验证.
另外,根据我的想法,没有人应该限制纬度/经度的小数点.
^([-+]?\d{1,2}([.]\d+)?),\s*([-+]?\d{1,3}([.]\d+)?)$
Run Code Online (Sandbox Code Playgroud)
或者目标C
^([-+]?\\d{1,2}([.]\\d+)?),\\s*([-+]?\\d{1,3}([.]\\d+)?)$
Run Code Online (Sandbox Code Playgroud)
小智 11
^-?[0-9]{1,3}(?:\.[0-9]{1,10})?$
Run Code Online (Sandbox Code Playgroud)
正则表达式细分:
^-?[0-9]{1,3}(?:\.[0-9]{1,10})?$
Run Code Online (Sandbox Code Playgroud)
-? #接受负值
^ #字符串开头
[0-9]{1,3} #匹配1-3位数(即0-999)
(?: #尝试匹配......
\. #小数点
[0-9]{1,10} #后跟1到10位数(即0-9999999999)
)? #...可选
$ #字符串结束
试试这个:
^(\()([-+]?)([\d]{1,2})(((\.)(\d+)(,)))(\s*)(([-+]?)([\d]{1,3})((\.)(\d+))?(\)))$
Run Code Online (Sandbox Code Playgroud)
请查看:
将表达式粘贴到顶部框中,然后将这样的内容放在底部框中:
(80.0123, -34.034)
(80.0123)
(80.a)
(980.13, 40)
(99.000, 122.000)
Run Code Online (Sandbox Code Playgroud)
正则表达式细分:
^ # 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).
Run Code Online (Sandbox Code Playgroud)
现在,这不做的是将自己限制在这个范围内:
(-90 to +90, and -180 to +180)
Run Code Online (Sandbox Code Playgroud)
相反,它简单地将自己限制在这个范围内:
(-99 to +99, -199 to +199)
Run Code Online (Sandbox Code Playgroud)
但重点主要在于打破表达的每一部分.
@macro-ferrari我确实找到了一种缩短它的方法,而且鉴于最近所有关于正则表达式引擎的讨论,我没有向前看
const LAT_RE = /^[+-]?(([1-8]?[0-9])(\.[0-9]{1,6})?|90(\.0{1,6})?)$/;
Run Code Online (Sandbox Code Playgroud)
const LONG_RE = /^[+-]?((([1-9]?[0-9]|1[0-7][0-9])(\.[0-9]{1,6})?)|180(\.0{1,6})?)$/;
Run Code Online (Sandbox Code Playgroud)
这是一个更严格的版本:
^([-+]?\d{1,2}[.]\d+),\s*([-+]?\d{1,3}[.]\d+)$
Run Code Online (Sandbox Code Playgroud)
-90-+90-180-+180正则表达式通过用 [0-9] 的子集替换 [0-9] 的多次使用来缩短@marco-ferrari解决方案。还从各个地方删除了不必要的量词,例如 ?:
lat "^([+-])?(?:90(?:\\.0{1,6})?|((?:|[1-8])[0-9])(?:\\.[0-9]{1,6})?)$";
long "^([+-])?(?:180(?:\\.0{1,6})?|((?:|[1-9]|1[0-7])[0-9])(?:\\.[0-9]{1,6})?)$";
**Matches for Lat**
Valid between -90 to +90 with up to 6 decimals.
**Matches for Long**
Valid between -180 to +180 with up to 6 decimals.
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
纬度: 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')
在示例中,纬度应该失败。