从 JSON 中提取位置名称

Extracting a location name from JSON

鉴于此文本 {"coord":{"lon":0.55,"lat":51.39},"weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10d"}],"base":"cmc stations","main":{"temp":285.81,"pressure":1011,"humidity":62,"temp_min":284.45,"temp_max":287.15},"wind":{"speed":11.3,"deg":170},"rain":{"1h":2.03},"clouds":{"all":20},"dt":1451480087,"sys":{"type":1,"id":5094,"message":0.0039,"country":"GB","sunrise":1451462577,"sunset":1451491082},"id":2648657,"name":"Gillingham","cod":200}

我试图只提取位置的名称(不带引号),在本例中是 Gillingham。

我不太擅长正则表达式并尝试搜索 \"name":\".*" 但没有结果。

我认为正则表达式不是您的最佳选择。您正在阅读 JSON 格式的文件。因此,您最好使用 built-in 库将 JSON 读入 data-structure,然后在伪代码中读取 "name" 属性:

city = deserializeJson(JSONdataFIle.read)["name"]

一个快速的技巧是:

city = filter (in CITIES) JsonData.splitInWords
http://txt2re.com/

在这种情况下,我不会说这是最适合您的解决方案,但它确实是一个。这是一个我经常用来从具有一致模式的文本中提取文本的网站。使用该网站,我得到了下面的 Java 代码。如果这不是您现在要找的东西,您应该将该站点添加为书签,以便以后在您的软件开发库中使用。对我来说,我所做的只是将您的文本粘贴到站点中,按显示匹配项,左键单击 "word" 作为您的城市名称,然后按 Java 选项卡。然后生成代码供我复制和粘贴。 如果您复制并粘贴此代码并将其 运行 作为您选择的 IDE 中的 Java 主 class,您将看到您的城市名称结果;但是,这只有在您过滤的内容的格式一致时才有效。如果您正在处理要解析的大量数据,Java 不是您最有效的文本解析语言。像 Perl 这样的语言对此很有帮助。但是,在当今的高端计算能力下,这取决于您要寻找什么。

导入java.util.regex.*;

public class Main
{
  public static void main(String[] args)
  {
    String txt="{\"coord\":{\"lon\":0.55,\"lat\":51.39},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10d\"}],\"base\":\"cmc stations\",\"main\":{\"temp\":285.81,\"pressure\":1011,\"humidity\":62,\"temp_min\":284.45,\"temp_max\":287.15},\"wind\":{\"speed\":11.3,\"deg\":170},\"rain\":{\"1h\":2.03},\"clouds\":{\"all\":20},\"dt\":1451480087,\"sys\":{\"type\":1,\"id\":5094,\"message\":0.0039,\"country\":\"GB\",\"sunrise\":1451462577,\"sunset\":1451491082},\"id\":2648657,\"name\":\"Gillingham\",\"cod\":200}";

    String re1=".*?";   // Non-greedy match on filler
    String re2="(?:[a-z][a-z]+)";   // Uninteresting: word
    String re3=".*?";   // Non-greedy match on filler
    String re4="(?:[a-z][a-z]+)";   // Uninteresting: word
    String re5=".*?";   // Non-greedy match on filler
    String re6="(?:[a-z][a-z]+)";   // Uninteresting: word
    String re7=".*?";   // Non-greedy match on filler
    String re8="(?:[a-z][a-z]+)";   // Uninteresting: word
    String re9=".*?";   // Non-greedy match on filler
    String re10="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re11=".*?";  // Non-greedy match on filler
    String re12="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re13=".*?";  // Non-greedy match on filler
    String re14="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re15=".*?";  // Non-greedy match on filler
    String re16="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re17=".*?";  // Non-greedy match on filler
    String re18="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re19=".*?";  // Non-greedy match on filler
    String re20="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re21=".*?";  // Non-greedy match on filler
    String re22="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re23=".*?";  // Non-greedy match on filler
    String re24="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re25=".*?";  // Non-greedy match on filler
    String re26="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re27=".*?";  // Non-greedy match on filler
    String re28="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re29=".*?";  // Non-greedy match on filler
    String re30="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re31=".*?";  // Non-greedy match on filler
    String re32="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re33=".*?";  // Non-greedy match on filler
    String re34="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re35=".*?";  // Non-greedy match on filler
    String re36="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re37=".*?";  // Non-greedy match on filler
    String re38="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re39=".*?";  // Non-greedy match on filler
    String re40="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re41=".*?";  // Non-greedy match on filler
    String re42="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re43=".*?";  // Non-greedy match on filler
    String re44="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re45=".*?";  // Non-greedy match on filler
    String re46="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re47=".*?";  // Non-greedy match on filler
    String re48="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re49=".*?";  // Non-greedy match on filler
    String re50="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re51=".*?";  // Non-greedy match on filler
    String re52="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re53=".*?";  // Non-greedy match on filler
    String re54="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re55=".*?";  // Non-greedy match on filler
    String re56="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re57=".*?";  // Non-greedy match on filler
    String re58="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re59=".*?";  // Non-greedy match on filler
    String re60="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re61=".*?";  // Non-greedy match on filler
    String re62="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re63=".*?";  // Non-greedy match on filler
    String re64="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re65=".*?";  // Non-greedy match on filler
    String re66="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re67=".*?";  // Non-greedy match on filler
    String re68="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re69=".*?";  // Non-greedy match on filler
    String re70="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re71=".*?";  // Non-greedy match on filler
    String re72="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re73=".*?";  // Non-greedy match on filler
    String re74="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re75=".*?";  // Non-greedy match on filler
    String re76="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re77=".*?";  // Non-greedy match on filler
    String re78="(?:[a-z][a-z]+)";  // Uninteresting: word
    String re79=".*?";  // Non-greedy match on filler
    String re80="((?:[a-z][a-z]+))";    // Word 1

    Pattern p = Pattern.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9+re10+re11+re12+re13+re14+re15+re16+re17+re18+re19+re20+re21+re22+re23+re24+re25+re26+re27+re28+re29+re30+re31+re32+re33+re34+re35+re36+re37+re38+re39+re40+re41+re42+re43+re44+re45+re46+re47+re48+re49+re50+re51+re52+re53+re54+re55+re56+re57+re58+re59+re60+re61+re62+re63+re64+re65+re66+re67+re68+re69+re70+re71+re72+re73+re74+re75+re76+re77+re78+re79+re80,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = p.matcher(txt);
    if (m.find())
    {
        String word1=m.group(1);
        System.out.print(word1.toString());
    }
  }
}
re.findall('\"name":\".*?"', x)

我同意最好的方法是将其作为 JSON 文件阅读。我做到了,但是尝试了您的正则表达式代码,并在将 JSON 设为字符串文件之后,这就是我得到的。

['"name":"Gillingham","cod"']

我匹配了 non-greedy '*?'确保它只是获取城市的名称

['"name":"Gillingham"']