Java 如果是元音,则提取不带最后一个字符的字符串

Java 如果是元音,则提取不带最后一个字符的字符串,java,regex,Java,Regex,对于正则表达式,如果最后一个字符是元音,如何提取整个单词(除了最后一个字符) 投入: ansia bello ansid 各项目的预期产出: ansi bell ansid 这是我尝试过的,但只有在结尾只有一个元音的情况下才有效: ^(.*[^aeiou]) 与@Sotirios Delimanolis在他的评论中所写的内容类似,但使用了单词边界,因此如果一行中有多个单词,它将起作用 \b(\w+?)[aeiou]?\b 其工作方式如下: 1) \b匹配单词的开头。这将适用于行中的第一个

对于正则表达式,如果最后一个字符是元音,如何提取整个单词(除了最后一个字符)

投入:

ansia
bello
ansid
各项目的预期产出:

ansi
bell
ansid
这是我尝试过的,但只有在结尾只有一个元音的情况下才有效:

^(.*[^aeiou])

与@Sotirios Delimanolis在他的评论中所写的内容类似,但使用了单词边界,因此如果一行中有多个单词,它将起作用

\b(\w+?)[aeiou]?\b
其工作方式如下:

1)
\b
匹配单词的开头。这将适用于行中的第一个单词或前面有非单词字符的单词(单词字符是任何字母数字字符)

2)
(\w+?)
匹配并捕获您关心的单词部分

2a)
\w
匹配任何单词字符

2b)
+
使
\w
匹配一次或多次

2c)
使
+
匹配的字符尽可能少。这一点很重要,因为如果单词末尾有元音,我们不希望在捕获组中匹配元音,而是让(3)处理它

3)
[aeiou]?
匹配但不捕获元音字符(如果存在元音字符)

3a)
[aeiou]
匹配元音

3b)
使
[aeiou]
匹配零次或一次

4)
\b
匹配单词的结尾。这适用于行尾的单词或后跟非单词字符的单词

您说过您正在使用的工具使用Java正则表达式实现,而ansid不适用于我的正则表达式。我用纯Java测试了它,它似乎对我有用:

Pattern pattern = Pattern.compile("\\b(\\w+?)[aeiou]?\\b");
Matcher matcher = pattern.matcher("ansia ansid cake cat dog");
while (matcher.find()) {
  System.out.println(matcher.group(1));
}
印刷品

ansi
ansid
cak
cat
dog

尝试正则表达式
(\b[a-zA-Z]+?(?=[aeiou]\b))|(\b[a-zA-Z]+?[^aeiou]\b)
。它捕获以辅音结尾的单词或以元音结尾的单词,并省略结尾的元音。

这种模式对我很有效
^(.*)(=[aeiou]$|$)

在case中,输入的单词可以排成一行,如下所示
使用此模式
\b([a-z]+)(?=[aeiou]\b |\b)


关于
^(.*?[aeiou]?$
?为什么不检查
元音列表是否包含(myString.charAt(myString.length()-1))
并在适当的情况下使用子字符串?我必须在Hive@user3753950:澄清一下:如果单词的最后一个字符是元音,您想提取整个单词而不提取其最后一个字符吗?当最后一个字符不是元音时,您希望发生什么?忽视它?@AmalMurali是的。我想忽略它。如果我有
ansia
,我想要
ansi
。如果我有
bello
,我想要
bell
。如果我有
ansid
,我想要
ansid
。它不工作。测试它是否匹配
ansid
。@Braj yes对于
[a-zA-Z0-9]*[^aeiou]
形式的任何单词,它将匹配整个单词并捕获整个单词,对于
[a-zA-Z0-9]*[aeiou]形式的单词
它将匹配整个单词,但只捕获除最后一个字符之外的所有内容,我相信这就是问题所要问的for@Braj是的,你说得对。不起作用。对于
ansid
我想要
ansid
也请向萨姆解释。对不起,误解了你的问题。更新的answer.OP是指可以连成一行的所有单词。一行可以包含我的话。在这种情况下,它将不起作用,对吗?在Braj,这在OP请求中不是很清楚,编辑了我的答案以匹配可以在一行中的整个单词!