Java正则表达式应该与子字符串匹配,但不能成为结果的一部分

Java正则表达式应该与子字符串匹配,但不能成为结果的一部分,java,regex,Java,Regex,我无法编写一个正则表达式来匹配是否存在子字符串,但不能使其成为结果的一部分 例如: 3/4 length sleeve 3/4 length sleeves 3/4th length sleeve 3/4 sleeve 3/4 sleeves 3/4th sleeve 3/4th sleeves 对于上述所有字符串,它应该匹配,但最终在结果中返回“3/4套筒” 我试着使用lookahead,但读完后我明白了为什么它不起作用 (?=(?:(3\/4)(?:th)?\s*(sleeve)s?)|

我无法编写一个正则表达式来匹配是否存在子字符串,但不能使其成为结果的一部分

例如:

3/4 length sleeve
3/4 length sleeves
3/4th length sleeve
3/4 sleeve
3/4 sleeves
3/4th sleeve 
3/4th sleeves
对于上述所有字符串,它应该匹配,但最终在结果中返回“3/4套筒”

我试着使用lookahead,但读完后我明白了为什么它不起作用

(?=(?:(3\/4)(?:th)?\s*(sleeve)s?)|(?:(3\/4)(?:th)?\s*length\s*(sleeve)s?)).*
尝试此项。此项匹配所有项并返回您想要的内容。将替换

$1 $2$3 $4
只需在末尾去掉空格

见演示

尝试此项。此项匹配所有项并返回您想要的内容。将替换

$1 $2$3 $4
只需在末尾去掉空格

见演示

尝试此项。此项匹配所有项并返回您想要的内容。将替换

$1 $2$3 $4
只需在末尾去掉空格

见演示

尝试此项。此项匹配所有项并返回您想要的内容。将替换

$1 $2$3 $4
只需在末尾去掉空格

见演示


您无法按您尝试的方式使用正向前瞻,相反,您可以将要匹配的内容放在周围,然后将匹配组连接在一起以获得匹配结果

String s  = "3/4 length sleeve\n" +
            "3/4 length sleeves\n" +
            "3/4th length sleeve\n" +
            "3/4 sleeve\n" +
            "3/4 sleeves\n"+
            "3/4th sleeve\n" +
            "3/4th sleeves\n" +
            "long sleeves\n" +
            "longfoobarsleeve" +
            "shortnjjgfjghfdjghsleeves\n" +
            "shorts sleeveeees\n" +
            "short sleeve";

Pattern p = Pattern.compile("(3/4|long|short).*?(sleeve)");
Matcher m = p.matcher(s);

while (m.find()) {
  System.out.println(m.group(1) + " " + m.group(2));
}
输出

3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
long sleeve
long sleeve
short sleeve
short sleeve
short sleeve

您无法按您尝试的方式使用正向前瞻,相反,您可以放置您想要匹配的内容,然后将匹配组连接在一起以获得匹配结果

String s  = "3/4 length sleeve\n" +
            "3/4 length sleeves\n" +
            "3/4th length sleeve\n" +
            "3/4 sleeve\n" +
            "3/4 sleeves\n"+
            "3/4th sleeve\n" +
            "3/4th sleeves\n" +
            "long sleeves\n" +
            "longfoobarsleeve" +
            "shortnjjgfjghfdjghsleeves\n" +
            "shorts sleeveeees\n" +
            "short sleeve";

Pattern p = Pattern.compile("(3/4|long|short).*?(sleeve)");
Matcher m = p.matcher(s);

while (m.find()) {
  System.out.println(m.group(1) + " " + m.group(2));
}
输出

3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
long sleeve
long sleeve
short sleeve
short sleeve
short sleeve

您无法按您尝试的方式使用正向前瞻,相反,您可以放置您想要匹配的内容,然后将匹配组连接在一起以获得匹配结果

String s  = "3/4 length sleeve\n" +
            "3/4 length sleeves\n" +
            "3/4th length sleeve\n" +
            "3/4 sleeve\n" +
            "3/4 sleeves\n"+
            "3/4th sleeve\n" +
            "3/4th sleeves\n" +
            "long sleeves\n" +
            "longfoobarsleeve" +
            "shortnjjgfjghfdjghsleeves\n" +
            "shorts sleeveeees\n" +
            "short sleeve";

Pattern p = Pattern.compile("(3/4|long|short).*?(sleeve)");
Matcher m = p.matcher(s);

while (m.find()) {
  System.out.println(m.group(1) + " " + m.group(2));
}
输出

3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
long sleeve
long sleeve
short sleeve
short sleeve
short sleeve

您无法按您尝试的方式使用正向前瞻,相反,您可以放置您想要匹配的内容,然后将匹配组连接在一起以获得匹配结果

String s  = "3/4 length sleeve\n" +
            "3/4 length sleeves\n" +
            "3/4th length sleeve\n" +
            "3/4 sleeve\n" +
            "3/4 sleeves\n"+
            "3/4th sleeve\n" +
            "3/4th sleeves\n" +
            "long sleeves\n" +
            "longfoobarsleeve" +
            "shortnjjgfjghfdjghsleeves\n" +
            "shorts sleeveeees\n" +
            "short sleeve";

Pattern p = Pattern.compile("(3/4|long|short).*?(sleeve)");
Matcher m = p.matcher(s);

while (m.find()) {
  System.out.println(m.group(1) + " " + m.group(2));
}
输出

3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
3/4 sleeve
long sleeve
long sleeve
short sleeve
short sleeve
short sleeve


请展示你所尝试过的。语言是什么?我想在收到完整的字符串后,您可以从末尾删除“length”,“s”,“th”@hwnd
3/4套筒(?=s)?搭配“3/4袖”和“3/4袖”。它在结果中返回“3/4套筒”。但是当我为'th'添加相同的逻辑时,比如说
3/4(?=th)?sleeve(?=s)?`,字符串与“3/4 sleeve”不匹配。它不会匹配。你不能像那样使用“向前看”。您使用的是哪种语言?@masum7的Java版本。是的,我可以,但最终ReEX将扩展到其他类型的“无袖”和“袖子”,一肩和1肩等。删除字符串后,需要不同的规则为不同的字符串。请显示你尝试过。什么是语言?我想在收到完整的字符串后,您可以从末尾删除“length”,“s”,“th”@hwnd
3/4套筒(?=s)?搭配“3/4袖”和“3/4袖”。它在结果中返回“3/4套筒”。但是当我为'th'添加相同的逻辑时,比如说
3/4(?=th)?sleeve(?=s)?`,字符串与“3/4 sleeve”不匹配。它不会匹配。你不能像那样使用“向前看”。您使用的是哪种语言?@masum7的Java版本。是的,我可以,但最终ReEX将扩展到其他类型的“无袖”和“袖子”,一肩和1肩等。删除字符串后,需要不同的规则为不同的字符串。请显示你尝试过。什么是语言?我想在收到完整的字符串后,您可以从末尾删除“length”,“s”,“th”@hwnd
3/4套筒(?=s)?搭配“3/4袖”和“3/4袖”。它在结果中返回“3/4套筒”。但是当我为'th'添加相同的逻辑时,比如说
3/4(?=th)?sleeve(?=s)?`,字符串与“3/4 sleeve”不匹配。它不会匹配。你不能像那样使用“向前看”。您使用的是哪种语言?@masum7的Java版本。是的,我可以,但最终ReEX将扩展到其他类型的“无袖”和“袖子”,一肩和1肩等。删除字符串后,需要不同的规则为不同的字符串。请显示你尝试过。什么是语言?我想在收到完整的字符串后,您可以从末尾删除“length”,“s”,“th”@hwnd
3/4套筒(?=s)?搭配“3/4袖”和“3/4袖”。它在结果中返回“3/4套筒”。但是当我为'th'添加相同的逻辑时,比如说
3/4(?=th)?sleeve(?=s)?`,字符串与“3/4 sleeve”不匹配。它不会匹配。你不能像那样使用“向前看”。您使用的是哪种语言?@masum7的Java版本。是的,我可以,但最终ReEX将扩展到考虑其他类型,如“无袖”和“袖子少”,一肩和1肩等。删除字符串后,需要不同的规则为不同的字符串。是的,这可以工作。实际上,我必须在正则表达式中添加其他情况,比如“长袖/长袖/长袖”应该返回长袖。短袖、无袖等也一样。尝试在两组中修复所有问题将很困难。难道没有任何解决方案可以像lookahead一样做到这一点吗?lookahead断言,例如,其他的东西跟在某个东西后面,所以你在这里尝试使用它的方式是,不。你可以总是将你的第一个单词组合在一起
(3/4长|短)。*?(袖子)
谢谢@hwnd。最后一件事,我如何处理无袖(和无肩带)在它。我把这个作为答案。就像我给你展示的那样,把他们加入一个小组。是的,这可以奏效。实际上,我必须在正则表达式中添加其他情况,比如“长袖/长袖/长袖”应该返回长袖。短袖、无袖等也一样。尝试在两组中修复所有问题将很困难。难道没有任何解决方案可以像lookahead一样做到这一点吗?lookahead断言,例如,其他的东西跟在某个东西后面,所以你在这里尝试使用它的方式是,不。你可以总是将你的第一个单词组合在一起
(3/4长|短)。*?(袖子)
谢谢@hwnd。最后一件事,我如何处理无袖(和无肩带)在它。我把这个作为答案。就像我给你展示的那样,把他们加入一个小组。是的,这可以奏效。实际上,我必须在正则表达式中添加其他情况,比如“长袖/长袖/长袖”应该返回长袖。短圆滑也一样