用正则表达式匹配规则替换每个单词的第一个元音

时间:2018-05-02 11:06:21

标签: java arrays regex replace pattern-matching

我想将句子中单词的每个元音改为一些阿拉伯语unicode。我有像

这样的输入
each vocal of letter each word in a sentence change into unicode use substring on java

使用子串替换规则

String[][] replacements1 = {
           {"a", "\u0627"}, 
           {"i", "\u0627\u064A"},
           {"u", "\u0627\u0648"},
           {"e", "\u0627\u064A"},
           {"o", "\u0627\u0648"} }

我使用空格分割为.split(" ")的数组,但这并不起作用。我切换到使用charAt(),但因为这超过1个字符或字符串,我需要使用一些正则表达式为子字符串replacement[][]定义每个索引0,而不影响单词中的另一个元音。我怎么能这样做?

输出应该是这样的:

\u0627\u064Aach vocal \u0627\u0648f letter \u0627\u064Aach word \u0627\u064An \u0627 sentence change \u0627\u064Anto unicode \u0627\u0648se substring \u0627\u0648n java"

1 个答案:

答案 0 :(得分:1)

根据正则表达式Matcher(也捕获单词的其他部分),使用"\\b([^aeiou]*)([aeiou])(\\w*)\\b"查找每个单词中的所有第一个元音。

使用Matcher提供的API,可以轻松构建替换后的字符串。

String str = "each vocal of letter each word in a sentence change into unicode use substring on java";

Map<String, String> replacements = new HashMap<String, String>() {{
    put("a", "\u0627");
    put("i", "\u0627\u064A");
    put("u", "\u0627\u0648");
    put("e", "\u0627\u064A");
    put("o", "\u0627\u0648");
}};

Pattern pattern = Pattern.compile("(?i)(.*?)\\b([^aeiou]*)([aeiou])(\\w*)\\b");
Matcher matcher = pattern.matcher(str);
StringBuffer buf = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(buf, "$1$2" + replacements.get(matcher.group(3)) + "$4");
}
matcher.appendTail(buf);
String replaced = buf.toString();

上述代码已经过测试并产生了预期的结果。

顺便说一下,我从替换字符串中删除了反斜杠,以避免插入阿拉伯字符,因此我可以看到逻辑有效,因为很难看到在打印混合权利时发生了什么从左到右的字符)。