【问题标题】:Extracting a location name from JSON从 JSON 中提取位置名称
【发布时间】:2015-12-30 13:36:19
【问题描述】:

鉴于此文本 {"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 不是一个选项?要捕获键值对,请使用"name":[\s]*"[^"]*"。但请注意,这不考虑值中的转义引号。

标签: regex quotes


【解决方案1】:

我不认为正则表达式是您的最佳选择。您正在阅读 JSON 格式文件。因此,您最好使用内置库将 JSON 读入数据结构,然后以伪代码读取“名称”属性:

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

一个快速的技巧是:

city = filter (in CITIES) JsonData.splitInWords

【讨论】:

    【解决方案2】:
    http://txt2re.com/
    

    在这种情况下,我不会说这是最适合您的解决方案,但它就是其中之一。这是我经常用来从具有一致模式的文本中提取文本的网站。使用该站点,我得到了下面的 Java 代码。如果这不是您现在正在寻找的内容,您应该将该站点添加为书签,以供以后在您的软件开发库中使用。对我来说,我所做的只是将您的文本粘贴到站点中,按显示匹配项,左键单击“单词”作为您的城市名称,然后按 Java 选项卡。然后生成代码供我复制和粘贴。 如果您复制并粘贴此代码并将其作为 Java 主类在您选择的 IDE 中运行,您将看到您的城市名称结果;但是,这只有在您过滤的格式一致的情况下才有效。如果您正在处理要解析的数据,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());
        }
      }
    }
    

    【讨论】:

      【解决方案3】:
      re.findall('\"name":\".*?"', x)
      

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

      ['"名称":"吉林汉姆","鳕鱼"']

      我使匹配不贪心'*?'以确保它只是获得城市的名称

      ['"姓名":"吉林汉姆"']

      【讨论】:

        猜你喜欢
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        相关资源
        最近更新 更多