在正则表达式中查找2个之间不包含单词的单词

时间:2019-02-20 04:08:59

标签: java regex

我试图找到解决方案,但是找不到。

一个正则表达式,它选择单词“(Dd)og(s)”和“(Cc)at(s)”之间的所有超过3个字符的单词。使用正则表达式。 Java中的结果中不应包含单词“(Dd)og(s)”和“(Cc)at(s)”。 我发现:

(?<=(^?\b[Dd]ogs?\b\s?|^?\b[Cc]ats?\b\s?)).*(\b[a-zA-Z']{4,}\b)*(?=(\b[Dd]ogs?\b\s|\b[Cc]ats?\b\s))

它可以工作,但可以输入3个字符以内的字符。

1 个答案:

答案 0 :(得分:0)

由于在注释(?i)((?<=(^?dogs? |^?\s?cats? ))(.*?)(?=(dogs?|cats?)))中的模式中,您使用了正向查找和正向查找来匹配猫或狗,因此您只需要获得4个字符以上的长字,就可以使用\G断言上一场比赛的结束。

例如:

(?:\b(?:dog|cat)s?|\G)\s+(?:((?!(?:dog|cat)s?\b)\w{3,})|\S+)(?=.*?\s+(?:dog|cat)s?\b)

在Java中:

String regex = "(?:\\b(?:dog|cat)s?|\\G)\\s+(?:((?!(?:dog|cat)s?\\b)\\w{3,})|\\S+)(?=.*?\\s+(?:dog|cat)s?\\b)";

请参见regex demo | Java demo

说明

  • (?:非捕获组
    • \b(?:dog|cat)s?字边界,用可选的s匹配狗或猫
    • |
    • \G在上一场比赛结束时声明位置
  • )关闭非捕获组
  • \s+匹配1个以上的空格字符
  • (?:非捕获组
    • (捕获组
      • (?!(?:dog|cat)s?\b)\w{3,}负向查找以检查后面的内容不是带有可选s的狗还是猫。如果是这种情况,则将单词char匹配3次以上
    • )关闭捕获组
    • |
    • \S+匹配1个非空格字符,因为我们无法匹配\w{3,}
  • )关闭非捕获组
  • (?=.*?\s+(?:dog|cat)s?\b)正面肯定可以断言右边是狗还是猫,并带有可选的s