正则表达式不替换所需的字符串

时间:2016-02-16 01:24:58

标签: java regex

我正在尝试删除这封信'从遵循此规则的任何字符串的末尾开始:

在单词的某个地方必须有一个元音,它不是在倒数第二个位置。在字符串的倒数第二个位置可以有一个元音,但是'如果唯一的元音位于倒数第二位,则不会被删除。

例如:

gas - >不会被改变,因为唯一的元音' a'处于'

之前的位置

玩具 - >会成为玩具'

示例 - >例如,因为在s之前的单词中有一个元音(e,a),而不仅是在倒数第二个位置。

现在我在一个名为Tokenizer.java的类类中有一个方法

public String remove(String word){

        //replace any words that end with s if the preceding word part contains a vowel not immediately before the 's'                                                                                   
        word.replaceAll("(?i)([aeiou][a-z]*[a-rt-z])s\\b", "$1");   

        return word; 
}

我在我的tester.java类中调用了这个方法 包标记器;

public class Tester {

    public static void main(String[] args) { 

        String word = token.deleteS("causes"); 
        System.out.println(word);
        word = token.remove("examples"); 
        System.out.println(word);
        word = token.deleteS("toys"); 
        System.out.println(word);
        word = token.deleteS("gas"); 
        System.out.println(word);

    }

}

我的输出:

causes
examples
toys
gas

预期产出:

cause
example
toy
gas

我遇到的问题是,当我在regex 101 link上测试它时,我发现它正在运行。为什么它在java中表现不同?

2 个答案:

答案 0 :(得分:1)

您应该在方法中替换以下行

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

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

或删除它并将其保留为功能主体

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

字符串函数的方法不会影响字符串本身只返回字符串的结果所以你需要通过将它分配给相同或新的变量来拦截这个新字符串

答案 1 :(得分:0)

试试这个:

public String remove(String word){

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

}