【问题标题】:Regex : Looking for dots in a sentence except inside braquets正则表达式:寻找句子中的点,括号内除外
【发布时间】:2017-06-23 17:32:05
【问题描述】:

我正在寻找一个正则表达式来拆分句子中“点”上的 java 字符串,除非这些点在括号之间。 也就是说,在这个例句中:

word1.word2.word3[word4.word5[word6.word7]].word8

我只想拆分前两个和最后一个(就在“word8”之前)。

我设法得到了这个正则表达式:

\.(?![^\[]*?\])

但这还不够好,因为它还在单词 4 和 5 之间的点上分裂:-(

有解决这个特殊情况的想法吗?

【问题讨论】:

  • 如果括号可以嵌套(看起来可以嵌套),则不能使用正则表达式来执行此操作;你必须使用某种解析器。
  • @arshajii :我不敢相信正则表达式不处理嵌套元素......难道没有某种负面回溯解决方案吗?
  • Java 正则表达式不支持递归。 PCRE/Boost/Onigmo 可以。
  • 我认为您无法仅通过 one 正则表达式来解决您的模式。最好将您的模式分成两步或多步

标签: java regex regex-lookarounds


【解决方案1】:

通过查看 PerlMonks discussions,我认为 Java 中的问题不能通过单个正则表达式来解决。

如果您可以使用多个步骤,那么您可以先删除所有pairs of brackets(从最里面开始),然后用点分割剩余的字符串:

public static void main (String[] args) {

    String str = "word1.word2.word3[word4.word5[word6.word7]].word8";
    final Pattern BRACKET_PAIR = Pattern.compile("\\[[^\\[\\]]+\\]");

    while (BRACKET_PAIR.matcher(str).find()) {
        str = BRACKET_PAIR.matcher(str).replaceFirst("");
    }

    for (String word: str.split("\\.")) {
        System.out.println(word);
    }
}

导致the output:

word1
word2
word3
word8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2011-04-12
    相关资源
    最近更新 更多