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;}
}

java英文单词单复数转换相关推荐

  1. java线程切换 notify_浅谈 Java线程状态转换及控制

    作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...

  2. Json对象与Json字符串的转化、JSON字符串与Java对象的转换

    一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...

  3. java 擦出,Java擦除和转换实例分析

    本文实例讲述了Java擦除和转换.分享给大家供大家参考,具体如下: 一 点睛 在严格的泛型代码里,带泛型声明的类总应该带着类型参数.但为了与老的Java代码保持一致,也允许在使用带泛型声明的类时不指定 ...

  4. Java父类强制转换子类原则

    转载自 Java父类强制转换子类原则 最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了. 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗? ...

  5. java.util.Date转换成java.sql.Date

    // 获取当前的系统时间,以java.util.Date对象返回 Date dateUtil = new Date(); // 获取当前的系统时间,以时间戳返回 long l = System.cur ...

  6. json java typeof_Json对象与Json字符串的转化、JSON字符串与Java对象的转换

    一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...

  7. VB与Java颜色值的转换

    正常的 RGB 颜色的有效范围,是从 0 到 16,777,215 (&HFFFFFF&).每种颜色的设置值(属性或参数)都是一个四字节的整数.对于这个 范围内的数,其高字节都是 0, ...

  8. 【图解】透彻Java线程状态转换

    大家好,我是阿星,好久不见,欢迎来到Java并发编程系列番外篇线程状态转换,内容通俗易懂,请放心食用. 线程状态 先来个开场四连问 Java线程状态有几个? Java线程状态是如何转换? Java线程 ...

  9. Java日期格式转换

    Java时间格式转换大全 import java.text.*; import java.util.Calendar; public class VeDate { /**    * 获取现在时间    ...

最新文章

  1. HTTP协议无状态中的 状态 到底指的是什么?
  2. Spring:一个Java框架15年的演化
  3. 沃尔玛拟投入两千多万元加强食品安全自检
  4. 使用TensorFlow1.0及以上版本的问题
  5. 计算机与操作系统基础小结
  6. Java反射机制概念及应用场景
  7. 软件测试第一次作业--石家名 3013218062
  8. CSS属性值之百分数
  9. xcode 工程没有模拟器_Xcode只允许我运行iOS设备(没有模拟器)
  10. 《天天数学》连载34:二月三日
  11. 20101022网站更新部署
  12. Illustrator 教程,了解 Illustrator 中的效果
  13. ibm服务器怎么收集日志信息,IBM X86 服务器Linux下收集DSA日志方法(包含BMC信息)...
  14. 【软件笔记------Orcad Capture CIS 17.2/pads vx2.7】------ orcadpads PCB设计简要教程
  15. 移植工具 TIA Portal
  16. Statement和PreparedStatement的区别
  17. Android 基础知识之 VelocityTracker使用(提供手指速度计算,可用于笔迹优化哦)
  18. WebStorm下载与安装2022版教程注册码WebStorm使用配置
  19. 第十章:Archiving
  20. 冒志鸿:大公司不模仿你,说明你危险了

热门文章

  1. java后端获取客户端(用户)真实ip,原理
  2. java 3位小数_数字有效小数第三位四舍五入
  3. php soecket服务器搭建_PHP socket 服务器框架集
  4. 依赖第三方库时出现的问题:Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 16
  5. 解决方案_环网柜监测解决方案
  6. git 相同commit_Git 合并多次 commit 、 删除某次 commit
  7. pytorch 对抗样本_《AI安全之对抗样本入门》—3.4 PyTorch
  8. python 32的值_示例解读 Python 2 和 Python 3 之间的主要差异
  9. think python 2ed_Think Python 2ed 笔记(二)
  10. java定义基础变量语句_编程语言第一:JAVA语言基础,变量