【问题标题】:Decipher this regex破译这个正则表达式
【发布时间】:2015-11-12 17:28:36
【问题描述】:

我回到了几个月前正在做的一个项目,当时我发现的一个问题是当我需要提取字符串的某个部分时。字符串同时使用了括号和引号,所以我不能像普通文本一样拆分它。

字符串的外观示例:

Word_Object("id"): preword:subword

现在说我只想抓取 ("id"): 之后的内容,即

'前置词:子词'

我发现 regex 帮助了我,并且花了很长时间才找到一个适用于我想要的示例。例如,我不得不安顿下来,因为我试图找到有关如何了解这个极其复杂的系统的资源,但我在这方面失败了。解决它的正则表达式如下所示:"Word_Object(\\(\"" + "id" + "\")\\): "

当时我很满意它似乎可以工作,但现在当我回到项目并尝试它时,我试图提取一个使用下划线_和下划线与以下单词的单词被遗漏了。

例如,使用正则表达式拆分文本Word_Object("id"): preword:subword_underscoreword(现在使用完整行)idSplit = subTemp.split("Word_Object(\\(\"" + "id" + "\")\\): ");将简单地返回:preword:subword而不是想要的preword:subword_underscoreword

我是否在这个正则表达式中以某种方式指示它忽略第二个特殊字符之后的任何内容(因为它确实接受 :,但显然 _ 破坏了一切)?

【问题讨论】:

  • 为什么要拆分?使用replaceAll 并用空字符串替换。
  • @stribizhev 不,您使用 groupsfind 来提取字符串。 replaceAllsplit 一样合乎逻辑。
  • 对于一个不太糟糕的问题,这有一个非常糟糕的标题。给你的问题一个更相关的标题可能是值得的。
  • 因为a specific request by the author,我投票决定关闭它。

标签: java regex string split


【解决方案1】:
public static void main(String[] args) {
    final String[] split = "Word_Object(\"id\"): preword:subword_underscoreword".split("Word_Object(\\(\"" + "id" + "\")\\): ");
    System.out.println("split = " + split[1]);
}

导致

split = preword:subword_underscoreword

【讨论】:

    【解决方案2】:

    由于您可能需要保持id 动态,这里有一个replaceAll 解决方案:

    String s = "Word_Object(\"id\"): preword:subword_underscoreword";
    System.out.println(s.replaceAll("Word_Object(\\(\"" + "id" + "\")\\):\\s*",""));
    

    IDEONE demo

    输出:preword:subword_underscoreword

    【讨论】:

    • 如果您的输入只是被简化了,而这种方法不适合您,请随时发表评论。
    【解决方案3】:

    你应该匹配而不是替换或拆分:

    private static final Pattern PRE_SUB_WORD_EXTRACT = Pattern.compile("Word_Object\\(\"\\w+\"\\): (\\w+):(\\w+)");
    
    public static void main(String[] args) {
        String test = "Word_Object(\"id\"): preword:subword_underscorewordusing";
        Matcher testMatcher = PRE_SUB_WORD_EXTRACT.matcher(test);
        if (!testMatcher.matches()) {
            System.out.println("Bollocks");
            System.exit(1);
        }
        System.out.printf("%s : %s%n", testMatcher.group(1), testMatcher.group(2));
    }
    

    【讨论】:

      【解决方案4】:

      正如在 cmets 中提到的,不需要使用 .split() 它会给你一个字符串数组而不是确切的字符串,只需将 .replace() 与一个空字符串一起使用,你就会得到你需要的结果:

              String str = "Word_Object(\"id\"): preword:subword_underscoreword";
              String str2 = str.replace("Word_Object(\"id\"): ", "");
      

      这是 a DEMO,它将在输出中为您提供 preword:subword_underscoreword

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 2016-08-31
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        相关资源
        最近更新 更多