【问题标题】:REGEX greediness or just wrong syntax正则表达式贪婪或语法错误
【发布时间】:2019-10-08 17:25:03
【问题描述】:

我试图从文本中的引号中删除所有[.!?],这样做,我想首先使用正则表达式捕获我的所有引号,包括[.!?],然后再删除它们。

我的正则表达式不起作用,可能是因为它太贪心了。它从我的“«”(索引 569 处的字符)到最后一个字符,即另一个“»”(索引 2730 处的字符)。

我的正则表达式是:

Pattern full=Pattern.compile("«.*[.!?].*?»");

Matcher mFull = full.matcher(result);
while(mFull.find()){
    System.out.println(mFull.start()+"  "+mFull.end());
}

所以我得到了:

569   2731

同样,贪婪的问题,捕捉句子(以任何 [A-Z] 开头并以任何 [.!?] 结尾。

【问题讨论】:

  • 为了有人帮助你,我建议你发布输入字符串和所需的输出。
  • 你一定在寻找类似s.replaceAll("(\\G(?!^)|«)([^«».!?]*)[.!?](?=[^«»]*»)", "$1$2")的东西
  • 哇,我不太会用正则表达式,你能解释一下吗?
  • 我在answer解释过。

标签: java regex regex-greedy


【解决方案1】:

你可以使用

s = s.replaceAll("(\\G(?!^)|«)([^«».!?]*)[.!?](?=[^«»]*»)", "$1$2");

regex demo

详情

  • (\G(?!^)|«) - 第 1 组(其值由替换模式中的 $1 引用):前一个匹配的结束或 «
  • ([^«».!?]*) - 第 2 组 ($2):除 «»!.? 之外的任何 0+ 个字符
  • [.!?] - 三个符号中的任何一个
  • (?=[^«»]*») - 在 0 个或多个字符之后必须有一个 »,而不是 «»,紧邻当前位置的右侧。

【讨论】:

  • 感谢您的帮助!它完美无缺!如果我问你,如果我想抓住一个句子(以 [AZ] 开头并以 [.!?] 结尾,我问你太多了,我也遇到了同样的贪婪问题。谢谢!跨度>
  • @Benech17 请记住,正则表达式是不知道的自然语言语法。如果您使用(?s)(?:^|[.?!])\s*(A.*?[?!.]) 模式,它可能在大多数情况下有效,但当句子包含缩写时会失败,例如Another U.S. military base was deployed.
  • 是的,我知道,但我会对我的文本进行预处理以“识别”该缩写等...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多