PatentRightUtils.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. package cn.cslg.pas.common.utils;
  2. import cn.cslg.pas.common.vo.PatentRightParams;
  3. import cn.cslg.pas.common.vo.RePatentClaim;
  4. import org.springframework.stereotype.Component;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.List;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. /**
  11. * 拆分权要工具类
  12. *
  13. * @Author chenyu
  14. * @Date 2023/4/25
  15. */
  16. @Component
  17. public class PatentRightUtils {
  18. public static List<RePatentClaim> formatPatentRight(PatentRightParams params) {
  19. try {
  20. //国家
  21. String country = params.getPatentNo().substring(0, 2);
  22. //原文
  23. String content = params.getContent();
  24. //译文
  25. String contentOut = params.getContentOut();
  26. //创建一个权要集合
  27. ArrayList<RePatentClaim> patentRights = new ArrayList<>();
  28. //若原文为null或空串,则直接结束并返回空集合;若译文为null,则置为空串
  29. if (content == null || content.equals("")) {
  30. return patentRights;
  31. }
  32. if (contentOut == null) {
  33. contentOut = "";
  34. }
  35. //将原文和译文的所有换行符 "\r\n"或是"\n" 替换成 "@",这样首先可以使得全文连在一起,其次再根据特殊符号@拆分权要
  36. if (content.contains("\r\n")) {
  37. content = content.replaceAll("\r\n", "@");
  38. }
  39. if (content.contains("\n")) {
  40. content = content.replaceAll("\n", "@");
  41. }
  42. if (contentOut.contains("\r\n")) {
  43. contentOut = contentOut.replaceAll("\r\n", "@");
  44. }
  45. if (contentOut.contains("\n")) {
  46. contentOut = contentOut.replaceAll("\n", "@");
  47. }
  48. //去掉译文的所有空格
  49. contentOut = contentOut.replaceAll(" +", "");
  50. //中日韩权要↓
  51. if (country.equals("CN") || country.equals("JP") || country.equals("KR") || content.contains("权利要求")) {
  52. String regex;
  53. if (content.contains("@2")) {
  54. regex = "@[0-9]+";
  55. } else if (content.contains("@[00")) {
  56. regex = "@\\[[0-9]+]";
  57. } else if (content.contains("@請求項")) {
  58. regex = "@【請求項[0-9]+】";
  59. } else if (content.contains("@청구항")) {
  60. regex = "@청구항 [0-9]+";
  61. } else {
  62. regex = "";
  63. }
  64. String[] strs; //原文数组
  65. String[] strsOut; //译文数组
  66. //若以上没有匹配到,则权要直接以句号 "。" 拆分
  67. if (regex.equals("")) {
  68. content = content.replaceAll("@", "");
  69. contentOut = contentOut.replaceAll("@", "");
  70. strs = content.split("。");
  71. strsOut = contentOut.split("。");
  72. //若匹配到,则根据不同情形拆分
  73. } else {
  74. Matcher matcher = Pattern.compile(regex).matcher(content);
  75. Matcher matcherOut = Pattern.compile(regex).matcher(contentOut);
  76. while (matcher.find()) {
  77. content = content.replaceFirst(matcher.group(), "\n" + matcher.group().substring(matcher.group().indexOf("@") + 1));
  78. }
  79. while (matcherOut.find()) {
  80. contentOut = contentOut.replaceFirst(matcherOut.group(), "\n" + matcherOut.group().substring(matcherOut.group().indexOf("@") + 1));
  81. }
  82. content = content.replaceAll("@", "");
  83. contentOut = contentOut.replaceAll("@", "");
  84. strs = content.split("\n");
  85. strsOut = contentOut.split("\n");
  86. }
  87. //定义父权要排序号
  88. String regex1 = "权利要求[0-9]+";
  89. String regex2 = "权利要求[0-9]+[至或~-]+[0-9]+";
  90. for (int i = 0; i < strs.length; i++) {
  91. //之前:if (strs[i].contains("权利要求")) {
  92. //现在:if(该权要有逗号,并且它第一句话中有"权利要求"4个字 || 该权要没有逗号,并且它有"权利要求"4个字) {
  93. if ((strs[i].contains(",") && strs[i].substring(0, strs[i].indexOf(",")).contains("权利要求")) || (!strs[i].contains(",") && strs[i].contains("权利要求"))) {
  94. Matcher matcher1 = Pattern.compile(regex1).matcher(strs[i]);
  95. Matcher matcher2 = Pattern.compile(regex2).matcher(strs[i]);
  96. if (matcher2.find()) {
  97. String parentNum = matcher2.group().substring(matcher2.group().indexOf("求") + 1);
  98. String[] parentNums;
  99. if (parentNum.contains("~")) {
  100. parentNums = parentNum.split("~");
  101. } else if (parentNum.contains("-")) {
  102. parentNums = parentNum.split("-");
  103. } else if (parentNum.contains("至")) {
  104. parentNums = parentNum.split("至");
  105. } else if (parentNum.contains("或")) {
  106. parentNums = parentNum.split("或");
  107. } else {
  108. parentNums = new String[0];
  109. }
  110. StringBuilder builder = new StringBuilder();
  111. for (int j = Integer.parseInt(parentNums[0]) - 1; j < Integer.parseInt(parentNums[parentNums.length - 1]); j++) {
  112. if ((builder + "").equals("")) {
  113. builder.append(j);
  114. } else {
  115. builder.append(",").append(j);
  116. }
  117. }
  118. RePatentClaim patentRight = new RePatentClaim()
  119. .setPatentNo(params.getPatentNo())
  120. .setType(0)
  121. .setContent(strs[i])
  122. .setSort(i)
  123. .setParentSort(builder + "");
  124. if (strsOut.length - 1 >= i) {
  125. //当翻译的长度大于原文权要的长度时,将剩下所有的译文给最后一条原文
  126. if (strsOut.length > strs.length && strs.length == (i + 1)) {
  127. patentRight.setContentOut(String.join(" ", Arrays.copyOfRange(strsOut, i, strsOut.length)));
  128. } else {
  129. patentRight.setContentOut(strsOut[i]);
  130. }
  131. }
  132. patentRights.add(patentRight);
  133. } else if (matcher1.find()) {
  134. String parentNum = matcher1.group().substring(matcher1.group().indexOf("求") + 1);
  135. RePatentClaim patentRight = new RePatentClaim()
  136. .setPatentNo(params.getPatentNo())
  137. .setType(0)
  138. .setContent(strs[i])
  139. .setSort(i)
  140. .setParentSort((Integer.parseInt(parentNum) - 1) + "");
  141. if (strsOut.length - 1 >= i) {
  142. patentRight.setContentOut(strsOut[i]);
  143. }
  144. patentRights.add(patentRight);
  145. }
  146. } else {
  147. RePatentClaim patentRight = new RePatentClaim()
  148. .setPatentNo(params.getPatentNo())
  149. .setType(1)
  150. .setContent(strs[i])
  151. .setSort(i)
  152. .setParentSort("-1");
  153. if (strsOut.length - 1 >= i) {
  154. //当翻译的长度大于原文权要的长度时,将剩下所有的译文给最后一条原文
  155. if (strsOut.length > strs.length && strs.length == (i + 1)) {
  156. patentRight.setContentOut(String.join(" ", Arrays.copyOfRange(strsOut, i, strsOut.length)));
  157. } else {
  158. patentRight.setContentOut(strsOut[i]);
  159. }
  160. }
  161. patentRights.add(patentRight);
  162. }
  163. }
  164. //英文专利的权要拆分 ↓
  165. } else {
  166. if (!content.equals("") && content.contains("1")) {
  167. content = content.substring(content.indexOf("1"));
  168. }
  169. if (!contentOut.equals("") && contentOut.contains("1")) {
  170. contentOut = contentOut.substring(contentOut.indexOf("1"));
  171. }
  172. String regex;
  173. if (content.contains("@2")) {
  174. regex = "@[0-9]+";
  175. } else if (content.contains("[001]")) {
  176. regex = "\\[[0-9]+]";
  177. } else {
  178. regex = "";
  179. }
  180. Matcher matcher = Pattern.compile(regex).matcher(content);
  181. Matcher matcherOut = Pattern.compile(regex).matcher(contentOut);
  182. while (matcher.find()) {
  183. content = content.replaceFirst(matcher.group(), "\n" + matcher.group().substring(matcher.group().indexOf("@") + 1));
  184. }
  185. while (matcherOut.find()) {
  186. contentOut = contentOut.replaceFirst(matcherOut.group(), "\n" + matcherOut.group().substring(matcherOut.group().indexOf("@") + 1));
  187. }
  188. content = content.replaceAll("@", "");
  189. contentOut = contentOut.replaceAll("@", "");
  190. String[] strs = content.split("\n");
  191. String[] strsOut = contentOut.split("\n");
  192. //定义父权要排序号
  193. String regex1 = "claim [0-9]+";
  194. String regex2 = "claims [0-9]+ or [0-9]+";
  195. String regex3 = "any preceding claim";
  196. for (int i = 0; i < strs.length; i++) {
  197. if (strs[i].contains("claim")) {
  198. Matcher matcher1 = Pattern.compile(regex1).matcher(strs[i]);
  199. Matcher matcher2 = Pattern.compile(regex2).matcher(strs[i]);
  200. Matcher matcher3 = Pattern.compile(regex3).matcher(strs[i]);
  201. if (matcher2.find()) {
  202. String parentNum = matcher2.group().substring(matcher2.group().indexOf("s") + 2);
  203. String[] parentNums;
  204. if (parentNum.contains(" or ")) {
  205. parentNums = parentNum.split(" or ");
  206. } else if (parentNum.contains(" - ")) {
  207. parentNums = parentNum.split(" - ");
  208. } else if (parentNum.contains(" to ")) {
  209. parentNums = parentNum.split(" to ");
  210. } else if (parentNum.contains("或")) {
  211. parentNums = parentNum.split("或");
  212. } else {
  213. parentNums = new String[0];
  214. }
  215. StringBuilder builder = new StringBuilder();
  216. for (int j = Integer.parseInt(parentNums[0]) - 1; j < Integer.parseInt(parentNums[parentNums.length - 1]); j++) {
  217. if ((builder + "").equals("")) {
  218. builder.append(j);
  219. } else {
  220. builder.append(",").append(j);
  221. }
  222. }
  223. RePatentClaim patentRight = new RePatentClaim()
  224. .setPatentNo(params.getPatentNo())
  225. .setType(0)
  226. .setContent(strs[i])
  227. .setSort(i)
  228. .setParentSort(builder + "");
  229. if (strsOut.length - 1 >= i) {
  230. //当翻译的长度大于原文权要的长度时,将剩下所有的译文给最后一条原文
  231. if (strsOut.length > strs.length && strs.length == (i + 1)) {
  232. patentRight.setContentOut(String.join(" ", Arrays.copyOfRange(strsOut, i, strsOut.length)));
  233. } else {
  234. patentRight.setContentOut(strsOut[i]);
  235. }
  236. }
  237. patentRights.add(patentRight);
  238. } else if (matcher1.find()) {
  239. String parentNum = matcher1.group().substring(matcher1.group().indexOf("m") + 2);
  240. RePatentClaim patentRight = new RePatentClaim()
  241. .setPatentNo(params.getPatentNo())
  242. .setType(0)
  243. .setContent(strs[i])
  244. .setSort(i)
  245. .setParentSort((Integer.parseInt(parentNum) - 1) + "");
  246. if (strsOut.length - 1 >= i) {
  247. //当翻译的长度大于原文权要的长度时,将剩下所有的译文给最后一条原文
  248. if (strsOut.length > strs.length && strs.length == (i + 1)) {
  249. patentRight.setContentOut(String.join(" ", Arrays.copyOfRange(strsOut, i, strsOut.length)));
  250. } else {
  251. patentRight.setContentOut(strsOut[i]);
  252. }
  253. }
  254. patentRights.add(patentRight);
  255. } else if (matcher3.find()) {
  256. StringBuilder builder = new StringBuilder();
  257. for (int sort = 0; sort < strs.length; sort++) {
  258. if (sort == i) {
  259. continue;
  260. }
  261. builder.append(i).append(",");
  262. }
  263. RePatentClaim patentRight = new RePatentClaim()
  264. .setPatentNo(params.getPatentNo())
  265. .setType(0)
  266. .setContent(strs[i])
  267. .setSort(i)
  268. .setParentSort(builder.substring(0, builder.lastIndexOf(",")));
  269. if (strsOut.length - 1 >= i) {
  270. //当翻译的长度大于原文权要的长度时,将剩下所有的译文给最后一条原文
  271. if (strsOut.length > strs.length && strs.length == (i + 1)) {
  272. patentRight.setContentOut(String.join(" ", Arrays.copyOfRange(strsOut, i, strsOut.length)));
  273. } else {
  274. patentRight.setContentOut(strsOut[i]);
  275. }
  276. }
  277. patentRights.add(patentRight);
  278. }
  279. } else {
  280. RePatentClaim patentRight = new RePatentClaim()
  281. .setPatentNo(params.getPatentNo())
  282. .setType(1)
  283. .setContent(strs[i])
  284. .setSort(i)
  285. .setParentSort("-1");
  286. if (strsOut.length - 1 >= i) {
  287. //当翻译的长度大于原文权要的长度时,将剩下所有的译文给最后一条原文
  288. if (strsOut.length > strs.length && strs.length == (i + 1)) {
  289. patentRight.setContentOut(String.join(" ", Arrays.copyOfRange(strsOut, i, strsOut.length)));
  290. } else {
  291. patentRight.setContentOut(strsOut[i]);
  292. }
  293. }
  294. patentRights.add(patentRight);
  295. }
  296. }
  297. }
  298. return patentRights;
  299. } catch (Exception e) {
  300. e.printStackTrace();
  301. ArrayList<RePatentClaim> patentRights = new ArrayList<>();
  302. patentRights.add(new RePatentClaim().setPatentNo(params.getPatentNo()).setContent(params.getContent()).setContentOut(params.getContentOut()).setType(1).setSort(0).setParentSort("-1"));
  303. return patentRights;
  304. }
  305. }
  306. }