我试图找到解决方案,但是找不到。
一个正则表达式,它选择单词“(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个字符以内的字符。
答案 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