java 如何验证地理坐标?

nzk0hqpo  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(190)

我尝试验证一个JTextField的文本,这个文本域的内容应该类似于66.160507, -153.36914166.160507,-153.369141(逗号后面没有空格),到目前为止我只验证了纬度和经度的范围,如下所示:

String [] splitted = jtextField.getText().split(",");
 double latitude = Double.parseDouble(splitted[0]);
 double longitude = Double.parseDouble(splitted[1])

if(latitude < -90 || latitude > 90)
  return false;
else
  continue;

if(longitude < -180 || longitude > 180)
      return false;
    else
      continue;

但是现在我如何检查JTextField中的文本是否具有正确的格式和顺序呢?我需要验证以下两种情况:

must be a double -> must be a comma -> must be a whitespace -> must be a double 
must be a double -> must be a comma -> must be a double
f87krz0w

f87krz0w1#

一种选择是使用正则表达式来验证文本字段中内容的形式,您可以在the Javadoc for the Pattern class中阅读正则表达式中可以使用的不同符号,但您可能使用的一些符号是

  • *任何数目的在前的匹配(包括没有);
  • +前面的内容的一个或多个匹配;
  • ?零个或一个匹配前面的内容;
  • [ ]字符范围。
  • \.一个点(如果反斜杠在Java String文本中,则需要转义),
  • \s任何空格(在String文本中,此反斜杠也需要转义)。

把所有这些放在一起,你可能会得到一个如下的正则表达式。

-?[1-9][0-9]*(\.[0-9]+)?,\s*-?[1-9][0-9]*(\.[0-9]+)?

来匹配一对纬度和经度。
这符合

  • 可选地为负号,
  • 第一位数字为非0的数字,
  • 任何数目的其它数字(甚至没有),
  • 可选地,由小数点组成的序列,然后是任意数量的其它数字,
  • 逗号,
  • 任意数量的空白字符(甚至没有),
  • 这一段的前四个要点,再来一遍

然后你可以写这样的代码。

String textValue = jtextField.getText();
String twoDoublesRegularExpression = "-?[1-9][0-9]*(\\.[0-9]+)?,\\s*-?[1-9][0-9]*(\\.[0-9]+)?";

if (textValue.matches(twoDoublesRegularExpression)) {
    // this value is OK
}
3hvapo4f

3hvapo4f2#

i创建2个正则表达式以验证经度和纬度:
经度

"^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"

纬度

"^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$";

public boolean validateLong(String longitude) {
        if (longitude != null) {
            String regexValidateLongitude = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$";
            return longitude.trim().matches(regexValidateLongitude);
        }
        return false;
    }

    public boolean validateLat(String latitude) {
        if (latitude != null) {
            String regexValidateLatitude = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$";
            return latitude.matches(regexValidateLatitude);
        }
        return  false;

    }

相关问题