以ch结尾的单词变复数怎么变

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以ch结尾的单词变复数怎么变相关的知识,希望对你有一定的参考价值。

参考技术A 大多数以ch结尾的名词变复数时都是在后面直接加上es。
如:
beach-beaches沙滩;
coach-coaches教练;
church-churches教堂;
peach-peaches桃子;
lunch-lunches午饭;
torch-torches手电;
watch-watches手表

扩展资料

  Camp sites are usually situated along the coast, close to beaches.

  野营地一般都位于海滨,靠近沙滩。

  Hundreds of coaches will converge on the capital.

  数百辆长途汽车将会在首都汇集。

  The city boasts a wealth of beautiful churches.

  这座城市拥有众多美丽的教堂。

  This year the farm gathered 700,000 kilograms of peaches from trees planted in 1980.

  这一年农场从1980年种的树上收了70万公斤桃子。

  Every morning mother puts up lunches for the three children.

  每天早晨母亲为三个孩子装好午饭。

将单词与特殊字符(é、è、...)进行比较时忽略变音符号

【中文标题】将单词与特殊字符(é、è、...)进行比较时忽略变音符号【英文标题】:Ignoring diacritic characters when comparing words with special characters (é, è, ...) 【发布时间】:2011-03-13 19:44:35 【问题描述】:

我有一个包含一些带有变音符号的比利时城市的列表:(Liège、Quievrain、Franière 等),我想转换这些特殊字符以与包含大写相同名称但没有变音符号(LIEGE、QUIEVRAIN、FRANIERE)

我首先尝试的是使用大写:

LIEGE.contentEqual(Liège.toUpperCase()) 但这不合适,因为Liège 的大写是LIÈGE 而不是LIEGE

我有一些复杂的想法,比如替换每个字符,但这听起来很愚蠢,而且过程很漫长。

关于如何以聪明的方式做到这一点的任何想法?

【问题讨论】:

类似问题,包括 Java 答案 ***.com/questions/249087/… Converting Symbols, Accent Letters to English Alphabet.的可能重复 叹息!以前你可以在 360 上用一条 TR 指令来做到这一点,但从那以后事情变得有点复杂了。 【参考方案1】:

Collat​​or 类是一个很好的方法(参见相应的javadoc)。这是一个显示如何使用它的单元测试:

import static org.junit.Assert.assertEquals;

import java.text.Collator;
import java.util.Locale;

import org.junit.Test;

public class CollatorTest 
    @Test public void liege() throws Exception 
        Collator compareOperator = Collator.getInstance(Locale.FRENCH);
        compareOperator.setStrength(Collator.PRIMARY);

        assertEquals(0, compareOperator.compare("Liege", "Liege")); // no accent
        assertEquals(0, compareOperator.compare("Liège", "Liege")); // with accent
        assertEquals(0, compareOperator.compare("LIEGE", "Liege")); // case insensitive
        assertEquals(0, compareOperator.compare("LIEGE", "Liège")); // case insensitive with accent

        assertEquals(1, compareOperator.compare("Liege", "Bruxelles"));
        assertEquals(-1, compareOperator.compare("Bruxelles", "Liege"));
    


编辑: 很抱歉看到我的回答没有满足您的需求;也许是因为我已经将它作为单元测试提出来了?这适合你吗?我个人觉得它更好,因为它是 short 并且它使用 SDK(无需替换字符串)

Collator compareOperator = Collator.getInstance(Locale.FRENCH);
compareOperator.setStrength(Collator.PRIMARY);
if (compareOperator.compare("Liège", "Liege") == 0) 
    // if we are here, then it's the "same" String

希望对你有帮助

【讨论】:

关于转换的问题,即去除变音符号,而不仅仅是比较。 这不是我阅读问题的方式:最终目标是比较字符串,但他在比较之前只考虑转换:“我想转换这些特殊的要比较的字符”。在我的回答中,您不必转换即可比较'这就是为什么我仍然认为我的回答很有帮助。【参考方案2】:

在 Java 中查看这个方法

private static final String PLAIN_ASCII = "AaEeIiOoUu" // grave
            + "AaEeIiOoUuYy" // acute
            + "AaEeIiOoUuYy" // circumflex
            + "AaOoNn" // tilde
            + "AaEeIiOoUuYy" // umlaut
            + "Aa" // ring
            + "Cc" // cedilla
            + "OoUu" // double acute
    ;

    private static final String UNICODE = "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"
            + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD"
            + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177"
            + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
            + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF"
            + "\u00C5\u00E5" + "\u00C7\u00E7" + "\u0150\u0151\u0170\u0171";

    /**
     * remove accented from a string and replace with ascii equivalent
     */
    public static String removeAccents(String s) 
        if (s == null)
            return null;
        StringBuilder sb = new StringBuilder(s.length());
        int n = s.length();
        int pos = -1;
        char c;
        boolean found = false;
        for (int i = 0; i < n; i++) 
            pos = -1;
            c = s.charAt(i);
            pos = (c <= 126) ? -1 : UNICODE.indexOf(c);
            if (pos > -1) 
                found = true;
                sb.append(PLAIN_ASCII.charAt(pos));
             else 
                sb.append(c);
            
        
        if (!found) 
            return s;
         else 
            return sb.toString();
        
    

【讨论】:

这个方法看起来又长又复杂,但这是我唯一成功使用的方法!其他 2 个似乎更好,但不起作用。非常感谢。 你怎么能说 Collat​​or 不起作用?有了它,你就不必用equals了,但你必须和0比较。 没试过,如果有更好的建议。确保它确实 removeAccents 而不是比较它们。 StringUtils.stripAccents 这样做commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/…【参考方案3】:

从 Java 6 开始,您可以使用 java.text.Normalizer:

public String unaccent(String s) 
    String normalized = Normalizer.normalize(s, Normalizer.Form.NFD);
    return normalized.replaceAll("[^\\pASCII]", "");

请注意,在 Java 5 中还有一个 sun.text.Normalizer,但强烈建议不要使用它,因为它是 Sun 专有 API 的一部分,并且在 Java 6 中已被删除。

【讨论】:

不幸的是,我猜 Android SDK 没有为我提供最新的 Java 6 功能......我收到这条消息:“Normalizer 无法解析”并且我无法导入 java.text.Normalizer跨度> 仅供参考 Java 1.5 在 Android 上,所以没有 Normalizer 不错!我不知道这个 API(但我仍在使用 Java 1.5)谢谢 对于那些仍然需要 Java Apache Commons Lang 有一个 stripAccents 方法,在 Java 6 中使用 java.text.Normalizersun.text.Normalizer 用于早期版本。 (我不知道后者是否可以在 Android 上使用。)【参考方案4】:

这是迄今为止我发现的最简单的解决方案,它在我们的应用程序中完美运行。

Normalizer.normalize(string, Normalizer.Form.NFD).replaceAll("\\pInCombiningDiacriticalMarks+", ""); 

但我不知道Normalizer是否在Android平台上可用。

【讨论】:

仅供参考 Java 1.5 在 Android 上,所以没有 Normalizer 这两个步骤被 StringUtils.stripAccents 合二为一,它利用了 java 6 之前的 sun.text.Normalizer commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/…【参考方案5】:

如果您仍然需要没有 Normalizer 类的 Android API 8 或更低版本(Android 2.2、Java 1.5),这是我的代码,我认为修改比 Pentium10 更好:

public class StringAccentRemover 

    @SuppressWarnings("serial")
    private static final HashMap<Character, Character> accents  = new HashMap<Character, Character>()
        
            put('Ą', 'A');
            put('Ę', 'E');
            put('Ć', 'C');
            put('Ł', 'L');
            put('Ń', 'N');
            put('Ó', 'O');
            put('Ś', 'S');
            put('Ż', 'Z');
            put('Ź', 'Z');

            put('ą', 'a');
            put('ę', 'e');
            put('ć', 'c');
            put('ł', 'l');
            put('ń', 'n');
            put('ó', 'o');
            put('ś', 's');
            put('ż', 'z');
            put('ź', 'z');
        
    ;
    /**
     * remove accented from a string and replace with ascii equivalent
     */
    public static String removeAccents(String s) 
        char[] result = s.toCharArray();
        for(int i=0; i<result.length; i++) 
            Character replacement = accents.get(result[i]);
            if (replacement!=null) result[i] = replacement;
        
        return new String(result);
    


【讨论】:

【参考方案6】:

由于 Froyo 或以前的 Android 版本不支持 Normalizer 类,我结合了 this 和 this(我都投了赞成票),并对其进行了优化,获得了几个辅助方法。方法 unaccentify 只是将变音符号转换为普通字符,而方法 slugify 为输入字符串生成一个 slug。希望它对某人有用。以下是源代码:

import java.util.Arrays;
import java.util.Locale;  
import java.util.regex.Pattern;  

public class SlugFroyo 
    private static final Pattern STRANGE = Pattern.compile("[^a-zA-Z0-9-]");
    private static final Pattern WHITESPACE = Pattern.compile("[\\s]");

    private static final String DIACRITIC_CHARS = "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"
            + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD"
            + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177"
            + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
            + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF"
            + "\u00C5\u00E5" + "\u00C7\u00E7" + "\u0150\u0151\u0170\u0171";

    private static final String PLAIN_CHARS = "AaEeIiOoUu" // grave
            + "AaEeIiOoUuYy" // acute
            + "AaEeIiOoUuYy" // circumflex
            + "AaOoNn" // tilde
            + "AaEeIiOoUuYy" // umlaut
            + "Aa" // ring
            + "Cc" // cedilla
            + "OoUu"; // double acute

    private static char[] lookup = new char[0x180];

    static 
        Arrays.fill(lookup, (char) 0);
        for (int i = 0; i < DIACRITIC_CHARS.length(); i++)
            lookup[DIACRITIC_CHARS.charAt(i)] = PLAIN_CHARS.charAt(i);
    

    public static String slugify(String s) 
        String nowhitespace = WHITESPACE.matcher(s).replaceAll("-");
        String unaccented = unaccentify(nowhitespace);
        String slug = STRANGE.matcher(unaccented).replaceAll("");
        return slug.toLowerCase(Locale.ENGLISH);
    

    public static String unaccentify(String s) 
        StringBuilder sb = new StringBuilder(s);
        for (int i = 0; i < sb.length(); i++) 
            char c = sb.charAt(i);
            if (c > 126 && c < lookup.length) 
                char replacement = lookup[c];
                if (replacement > 0)
                    sb.setCharAt(i, replacement);
            
        
        return sb.toString();
    

【讨论】:

【参考方案7】:

我不知道它是否在 Android 上可用,但在 JVM 上,您应该在您的项目中重新实现它并重用现有代码:只需使用 org.apache.commons.lang3.StringUtils#stripAccents

【讨论】:

是的,只需将其添加为依赖项即可:编译“org.apache.commons:commons-lang3:3.9”【参考方案8】:

对于那些正在寻找干净的 java 解决方案的人,请使用 apache commons:

StringUtils.stripAccents("Liège").toUpperCase();

这将返回

LIEGE

【讨论】:

唯一适用于比较操作任何一侧的任何变音符号的答案

以上是关于以ch结尾的单词变复数怎么变的主要内容,如果未能解决你的问题,请参考以下文章

英语中怎么区分动词后面+s或+es

java 利用字符串的操作,实现英文名词单数变复数的效果。例如:box--boxes boy--boys等

英文单词复数啥时候加s,啥时候加es

英语:在啥情况下单词后面加s,在啥情况下加es

英语动词加es的规律

怎么分清英语的单复数形式?