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

时间:2016-02-15 23:08:56

标签: java regex string

我试图创建一个正则表达式模式,我可以检测字符串是否以'结尾。我想删除' s'从字符串的末尾开始,但是有一个问题......

我想删除''如果且仅当前面的单词部分包含一个元素之前并不立即,并且该单词不包含另一个元音。

例如,“销售”这个词就是'将成为' sale'因为在' e之前有一个元音。在“'之前”在这个词的最后。

单词'示例' - > '例如'

但是“气体”这个词是什么?应该保持气体,因为唯一的元音是紧接在“#”之前的元音。

我想出了以下内容:

public String removeS(String word) {
        if (word.matches(".*[a|e|i|o|u][.*]s")){
            word = word.substring(0, word.length()-1);
        }
        return word; 
}

现在,当我输入像" sales"这样的词时,没有任何反应。它仍然是"销售"。我假设这与我用来匹配字符串的正则表达式模式有关。

我对正则表达式相对较新,但我试图用".*[a|e|i|o|u][.*]s"得到的就是我上面解释的内容。匹配一个字符串,该字符串在字符串末尾的s之前的字符之前具有一些元音(a,e,i,o,u)。我在这里可以忽略一些东西吗?

2 个答案:

答案 0 :(得分:4)

我建议你不要尝试这样做,因为你的例外列表会增长,增长,增长,增长,增长,增长......

例如,根据您的规则,工作stress会删除最后一个s

无论如何,这是一个增强版本,也保持双重s完整:

str.replaceAll("(?i)([aeiou][a-z]*[a-rt-z])s\\b", "$1")

See regex101 for result。请注意stresshas是如何保持不变的。

另请注意wishes成为wishe的方式,这是错误的。对于像这样的简单规则,英语拼写太复杂了。

哦,我喜欢Andy Turner给出的铁路图。 Here it is for this regex

答案 1 :(得分:1)

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

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

    return word; 
}

这匹配“零个或多个字符”,后跟“一个元音”,后跟“一个或多个字符”,后跟“另一个元音”,后跟“s”。

您可以将此here可视化。

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