Java 将s识别为元音后的最后一个字符的正则表达式模式

Java 将s识别为元音后的最后一个字符的正则表达式模式,java,regex,string,Java,Regex,String,我试图创建一个正则表达式模式,在这里我可以检测字符串是否以“s”结尾。然后我想删除字符串末尾的“s”,但有一个问题 如果且仅当前面的单词部分包含的元音不在“s”之前,并且该单词不包含另一个元音时,我想删除“s” 例如,“sales”一词会变成“sale”,因为在“e”之前有一个元音,在单词末尾的“s”之前 单词“示例”->“示例” 但是“gas”这个词应该保持为gas,因为唯一的元音是紧跟在“s”之前的元音 我提出了以下建议: public String removeS(String word)

我试图创建一个正则表达式模式,在这里我可以检测字符串是否以“s”结尾。然后我想删除字符串末尾的“s”,但有一个问题

如果且仅当前面的单词部分包含的元音不在“s”之前,并且该单词不包含另一个元音时,我想删除“s”

例如,“sales”一词会变成“sale”,因为在“e”之前有一个元音,在单词末尾的“s”之前

单词“示例”->“示例”

但是“gas”这个词应该保持为gas,因为唯一的元音是紧跟在“s”之前的元音

我提出了以下建议:

public String removeS(String word) {
        if (word.matches(".*[a|e|i|o|u][.*]s")){
            word = word.substring(0, word.length()-1);
        }
        return word; 
}
现在,当我输入“sales”这样的词时,什么都没有发生。它只是保留了“销售”这个词。我假设is与我用来匹配字符串的regex模式有关


我对regex相对来说是新手,但我试图通过这个
“*[a | e | I | o | u][.]s”
得到的是我上面解释的。与字符串匹配,该字符串在字符串末尾的s前面的字符前面有一些元音(a、e、i、o、u)。我在这里忽略了什么吗?

现在,我不知道您的用例的详细信息,只知道提供的信息,但这应该有用:

public String removeS(String word) {
    if (word.matches(".*[aeiou].+[aeiou]s")){
        word = word.substring(0, word.length()-1);
    }

    return word; 
}
这匹配“零个或多个字符”,后跟“一个元音”,后跟“一个或多个字符”,后跟“另一个元音”,后跟“s”

你可以想象这一点


请注意,这要求两个元音之间至少有一个字母。如果您想将
sees
变为
see
,请将
+
更改为另一个
*
,如。

我建议您不要尝试此操作,因为您的异常列表将不断增长,不断增长,不断增长,不断增长,不断增长

例如,工作
压力
将按照您的规则删除最后一个
s

无论如何,这里有一个增强版,它也保持了double-
s
的完整性:

str.replaceAll("(?i)([aeiou][a-z]*[a-rt-z])s\\b", "$1")
。请注意,
应力
has
是如何单独存在的

还要注意
愿望如何变成
愿望,这是错误的。对于像这样简单的规则来说,英语拼写太复杂了


哦,我喜欢安迪·特纳给我的铁路图

*[aeiou].*s
可能更好;但是我仍然不理解这个条件
我想删除's'当且仅当前面的单词部分包含一个元音而不是紧接着's'
类似于
[^aeiou]。+[aeiou]s
?首先,你的语法是完全无效的。到目前为止,编写您构建的正则表达式的正确方法是
“*[aeiou].*s”
,但是这与您想要的方法不匹配。@很抱歉,这有点混乱。要删除s,单词中必须有一个不是倒数第二个字符的元音。所以“gas”这个词不会删除s,因为唯一的元音就在s之前。在Otter中的单词中需要有另一个元音才能删除s。与“sales”一词一样,有一个元音“a”不在倒数第二个位置,但肯定会。它们将被
*
/
+
吃掉。这非常有效。我用它作为另一种方法的一部分,我检查了SS案例,但效果更好。您能解释一下您使用的正则表达式吗?然后单击指向正则表达式101的链接。右上角有解释。这够好吗?