java英文单词单复数转换

本文介绍了一个实用的Java类,用于实现英语单词的单数与复数形式的转换。通过正则表达式和一系列规则,该类能准确处理各种特殊变化,如不规则变化和不可数名词。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package steam;

import java.util.*;
import java.util.regex.*;
/**
 * 
 *	单复数转换类
 * 2018年12月30日
 */

public class Inflector {

	private static final Pattern UNDERSCORE_PATTERN_1 = Pattern.compile("([A-Z]+)([A-Z][a-z])");
	private static final Pattern UNDERSCORE_PATTERN_2 = Pattern.compile("([a-z\\d])([A-Z])");

	private static List<RuleAndReplacement> plurals = new ArrayList<RuleAndReplacement>();
	private static List<RuleAndReplacement> singulars = new ArrayList<RuleAndReplacement>();
	private static List<String> uncountables = new ArrayList<String>();

	private static Inflector instance; 

	private Inflector() {
		initialize();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 单数转复数
		System.out.println(Inflector.getInstance().pluralize("water"));
		System.out.println(Inflector.getInstance().pluralize("box"));
		System.out.println(Inflector.getInstance().pluralize("tomato"));
		// 复数转单数
		System.out.println(Inflector.getInstance().singularize("apples"));
	}
	private void initialize() {
		plural("$", "s");
		plural("s$", "s");
		plural("(ax|test)is$", "$1es");
		plural("(octop|vir)us$", "$1i");
		plural("(alias|status)$", "$1es");
		plural("(bu)s$", "$1es");
		plural("(buffal|tomat)o$", "$1oes");
		plural("([ti])um$", "$1a");
		plural("sis$", "ses");
		plural("(?:([^f])fe|([lr])f)$", "$1$2ves");
		plural("(hive)$", "$1s");
		plural("([^aeiouy]|qu)y$", "$1ies");
		plural("([^aeiouy]|qu)ies$", "$1y");
		plural("(x|ch|ss|sh)$", "$1es");
		plural("(matr|vert|ind)ix|ex$", "$1ices");
		plural("([m|l])ouse$", "$1ice");
		plural("(ox)$", "$1es");
		plural("(quiz)$", "$1zes");

		singular("s$", "");
		singular("(n)ews$", "$1ews");
		singular("([ti])a$", "$1um");
		singular("((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$", "$1$2sis");
		singular("(^analy)ses$", "$1sis");
		singular("([^f])ves$", "$1fe");
		singular("(hive)s$", "$1");
		singular("(tive)s$", "$1");
		singular("([lr])ves$", "$1f");
		singular("([^aeiouy]|qu)ies$", "$1y");
		singular("(s)eries$", "$1eries");
		singular("(m)ovies$", "$1ovie");
		singular("(x|ch|ss|sh)es$", "$1");
		singular("([m|l])ice$", "$1ouse");
		singular("(bus)es$", "$1");
		singular("(o)es$", "$1");
		singular("(shoe)s$", "$1");
		singular("(cris|ax|test)es$", "$1is");
		singular("([octop|vir])i$", "$1us");
		singular("(alias|status)es$", "$1");
		singular("^(ox)es", "$1");
		singular("(vert|ind)ices$", "$1ex");
		singular("(matr)ices$", "$1ix");
		singular("(quiz)zes$", "$1");

		irregular("person", "people");
		irregular("man", "men");
		irregular("child", "children");
		irregular("sex", "sexes");
		irregular("move", "moves");

		uncountable(new String[] { "equipment", "information", "rice", "money", "species", "series", "fish", "sheep" });
	}

	public static Inflector getInstance() {
		if (instance == null) {
			instance = new Inflector();
		}
		return instance;
	}

	public String underscore(String camelCasedWord) {

		String underscoredWord = UNDERSCORE_PATTERN_1.matcher(camelCasedWord).replaceAll("$1_$2");
		underscoredWord = UNDERSCORE_PATTERN_2.matcher(underscoredWord).replaceAll("$1_$2");
		underscoredWord = underscoredWord.replace('-', '_').toLowerCase();

		return underscoredWord;
	}

	public String pluralize(String word) {
		if (uncountables.contains(word.toLowerCase())) {
			return word;
		}
		return replaceWithFirstRule(word, plurals);
	}

	public String singularize(String word) {
		if (uncountables.contains(word.toLowerCase())) {
			return word;
		}
		return replaceWithFirstRule(word, singulars);
	}

	private String replaceWithFirstRule(String word, List<RuleAndReplacement> ruleAndReplacements) {

		for (RuleAndReplacement rar : ruleAndReplacements) {
			String rule = rar.getRule();
			String replacement = rar.getReplacement();

			// Return if we find a match.
			Matcher matcher = Pattern.compile(rule, Pattern.CASE_INSENSITIVE).matcher(word);
			if (matcher.find()) {
				return matcher.replaceAll(replacement);
			}
		}
		return word;
	}

	public String tableize(String className) {
		return pluralize(underscore(className));
	}

	public String tableize(Class<?> klass) {
		String className = klass.getName().replace(klass.getPackage().getName() + ".", "");
		return tableize(className);
	}

	public static void plural(String rule, String replacement) {
		plurals.add(0, new RuleAndReplacement(rule, replacement));
	}

	public static void singular(String rule, String replacement) {
		singulars.add(0, new RuleAndReplacement(rule, replacement));
	}

	public static void irregular(String singular, String plural) {
		plural(singular, plural);
		singular(plural, singular);
	}

	public static void uncountable(String... words) {
		for (String word : words) {
			uncountables.add(word);
		}
	}
}

class RuleAndReplacement {
	private String rule;
	private String replacement;

	public RuleAndReplacement(String rule, String replacement) {
		this.rule = rule;
		this.replacement = replacement;
	}

	public String getReplacement() {
		return replacement;
	}

	public void setReplacement(String replacement) {
		this.replacement = replacement;
	}

	public String getRule() {
		return rule;
	}

	public void setRule(String rule) {
		this.rule = rule;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值