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请求中不是很清楚,编辑了我的答案以匹配可以在一行中的整个单词!