PatentRightUtils.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. package cn.cslg.pas.common.utils;
  2. import cn.cslg.pas.common.model.params.PatentRightParams;
  3. import cn.cslg.pas.domain.PatentRight;
  4. import org.springframework.stereotype.Component;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.regex.Matcher;
  8. import java.util.regex.Pattern;
  9. /**
  10. * 拆分权要工具类
  11. *
  12. * @Author chenyu
  13. * @Date 2023/4/25
  14. */
  15. @Component
  16. public class PatentRightUtils {
  17. public List<PatentRight> formatPatentRight(PatentRightParams params) {
  18. //国家
  19. String country = params.getPatentNo().substring(0, 2);
  20. //原文
  21. String content = params.getContent();
  22. //译文
  23. String contentOut = params.getContentOut();
  24. //创建一个权要集合
  25. ArrayList<PatentRight> patentRights = new ArrayList<>();
  26. //若权要原文为空,则直接返回空集合
  27. if (content == null || content.equals("")) {
  28. return patentRights;
  29. }
  30. //先去掉所有换行符,使原文连成一个长字符串
  31. if (content.contains("\r\n")) {
  32. content = content.replaceAll("\r\n", "");
  33. } else {
  34. content = content.replaceAll("\n", "");
  35. }
  36. if (contentOut == null) {
  37. contentOut = "";
  38. }
  39. if (contentOut.contains("\r\n")) {
  40. contentOut = contentOut.replaceAll("\r\n", "");
  41. } else {
  42. contentOut = contentOut.replaceAll("\n", "");
  43. }
  44. //去掉译文的所有空格
  45. contentOut = contentOut.replaceAll(" +", "");
  46. //中日韩专利↓
  47. if (country.equals("CN") || country.equals("JP") || country.equals("KR")) {
  48. String regex;
  49. if (content.contains("。2.")) {
  50. regex = "。[0-9]+\\.";
  51. } else if (content.contains("。2、")) {
  52. regex = "。[0-9]+、";
  53. } else if (content.contains("[001]")) {
  54. regex = "\\[[0-9]+]";
  55. } else if (content.contains("請求項")) {
  56. regex = "。【請求項[0-9]+】";
  57. } else if (content.contains(".청구항 2")) {
  58. regex = "\\.청구항 [0-9]+";
  59. } else {
  60. regex = "";
  61. }
  62. Matcher matcher = Pattern.compile(regex).matcher(content);
  63. Matcher matcherOut = Pattern.compile(regex).matcher(contentOut);
  64. while (matcher.find()) {
  65. if (matcher.group().contains(".청구항")) {
  66. //".청구항 2" -> "\\.청구항 2"
  67. String matcherGroup = matcher.group().replace(".", "\\.");
  68. //".청구항 2" -> ".\n청구항 2"
  69. content = content.replaceFirst(matcherGroup, ".\n" + matcherGroup.substring(matcherGroup.indexOf(".") + 1));
  70. } else if (matcher.group().contains(".")) {
  71. //"。2." -> "。2\\."
  72. String matcherGroup = matcher.group().replace(".", "\\.");
  73. //"。2." -> "。\n2."
  74. content = content.replaceFirst(matcherGroup, "。\n" + matcherGroup.substring(matcherGroup.indexOf("。") + 1, matcherGroup.indexOf("\\")) + ".");
  75. } else if (matcher.group().contains("、") || matcher.group().contains("請求項")) {
  76. content = content.replaceFirst(matcher.group(), "。\n" + matcher.group().substring(matcher.group().indexOf("。") + 1));
  77. }
  78. }
  79. String[] strs = content.split("\n");
  80. while (matcherOut.find()) {
  81. if (matcherOut.group().contains(".")) {
  82. String matcherOutGroup = matcherOut.group().replace(".", "\\.");
  83. contentOut = contentOut.replaceFirst(matcherOutGroup, "。\n" + matcherOutGroup.substring(matcherOutGroup.indexOf("。") + 1, matcherOutGroup.indexOf("\\")) + ".");
  84. } else if (matcherOut.group().contains("、")) {
  85. contentOut = contentOut.replaceFirst(matcherOut.group(), "。\n" + matcherOut.group().substring(matcherOut.group().indexOf("。") + 1));
  86. }
  87. }
  88. String[] strsOut = contentOut.split("\n");
  89. //定义父权要排序号
  90. String regex1 = "权利要求[0-9]+";
  91. String regex2 = "权利要求[0-9]+[至或~-]+[0-9]+";
  92. for (int i = 0; i < strs.length; i++) {
  93. //之前:if (strs[i].contains("权利要求")) {
  94. //现在:if(该权要有逗号,并且它第一句话中有"权利要求"4个字 || 该权要没有逗号,并且它有"权利要求"4个字) {
  95. if ((strs[i].contains(",") && strs[i].substring(0, strs[i].indexOf(",")).contains("权利要求")) || (!strs[i].contains(",") && strs[i].contains("权利要求"))) {
  96. Matcher matcher1 = Pattern.compile(regex1).matcher(strs[i]);
  97. Matcher matcher2 = Pattern.compile(regex2).matcher(strs[i]);
  98. if (matcher2.find()) {
  99. String parentNum = matcher2.group().substring(matcher2.group().indexOf("求") + 1);
  100. String[] parentNums;
  101. 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 if (parentNum.contains("或")) {
  108. parentNums = parentNum.split("或");
  109. } else {
  110. parentNums = new String[0];
  111. }
  112. StringBuilder builder = new StringBuilder();
  113. for (int j = Integer.parseInt(parentNums[0]) - 1; j < Integer.parseInt(parentNums[parentNums.length - 1]); j++) {
  114. if ((builder + "").equals("")) {
  115. builder.append(j);
  116. } else {
  117. builder.append(",").append(j);
  118. }
  119. }
  120. PatentRight patentRight = new PatentRight()
  121. .setPatentId(params.getPatentId())
  122. .setType(0)
  123. .setContent(strs[i])
  124. .setSort(i)
  125. .setParentSort(builder + "");
  126. if (strsOut.length - 1 >= i) {
  127. patentRight.setContentOut(strsOut[i]);
  128. }
  129. patentRights.add(patentRight);
  130. } else if (matcher1.find()) {
  131. String parentNum = matcher1.group().substring(matcher1.group().indexOf("求") + 1);
  132. PatentRight patentRight = new PatentRight()
  133. .setPatentId(params.getPatentId())
  134. .setType(0)
  135. .setContent(strs[i])
  136. .setSort(i)
  137. .setParentSort((Integer.parseInt(parentNum) - 1) + "");
  138. if (strsOut.length - 1 >= i) {
  139. patentRight.setContentOut(strsOut[i]);
  140. }
  141. patentRights.add(patentRight);
  142. }
  143. } else {
  144. PatentRight patentRight = new PatentRight()
  145. .setPatentId(params.getPatentId())
  146. .setType(1)
  147. .setContent(strs[i])
  148. .setSort(i)
  149. .setParentSort("-1");
  150. if (strsOut.length - 1 >= i) {
  151. patentRight.setContentOut(strsOut[i]);
  152. }
  153. patentRights.add(patentRight);
  154. }
  155. }
  156. //英文专利的权要拆分 ↓
  157. } else {
  158. content = content.substring(content.indexOf("1."));
  159. if (contentOut.contains("1.")) {
  160. contentOut = contentOut.substring(contentOut.indexOf("1."));
  161. } else {
  162. contentOut = contentOut.substring(contentOut.indexOf("1、"));
  163. }
  164. String regex;
  165. if (content.contains("1.")) {
  166. regex = "\\.[0-9]+\\. ";
  167. } else if (content.contains("1、")) {
  168. regex = "\\.[0-9]+\\. ";
  169. } else if (content.contains("[001]")) {
  170. regex = "\\[[0-9]+]";
  171. } else {
  172. regex = "";
  173. }
  174. Matcher matcher = Pattern.compile(regex).matcher(content);
  175. Matcher matcherOut = Pattern.compile("。[0-9]+\\.").matcher(contentOut);
  176. while (matcher.find()) {
  177. String matcherGroup = matcher.group().replace(".", "\\.");
  178. content = content.replaceFirst(matcherGroup, ".\n" + matcherGroup.substring(matcherGroup.indexOf(".") + 1, matcherGroup.lastIndexOf("\\")) + ". ");
  179. }
  180. String[] strs = content.split("\n");
  181. while (matcherOut.find()) {
  182. String matcherOutGroup = matcherOut.group().replace(".", "\\.");
  183. contentOut = contentOut.replaceFirst(matcherOutGroup, "。\n" + matcherOutGroup.substring(matcherOutGroup.indexOf("。") + 1, matcherOutGroup.indexOf("\\")) + ".");
  184. }
  185. String[] strsOut = contentOut.split("\n");
  186. //定义父权要排序号
  187. String regex1 = "claim [0-9]+";
  188. String regex2 = "claims [0-9]+ or [0-9]+";
  189. for (int i = 0; i < strs.length; i++) {
  190. if (strs[i].contains("claim")) {
  191. Matcher matcher1 = Pattern.compile(regex1).matcher(strs[i]);
  192. Matcher matcher2 = Pattern.compile(regex2).matcher(strs[i]);
  193. if (matcher2.find()) {
  194. String parentNum = matcher2.group().substring(matcher2.group().indexOf("s") + 2);
  195. String[] parentNums;
  196. if (parentNum.contains(" or ")) {
  197. parentNums = parentNum.split(" or ");
  198. } else if (parentNum.contains(" - ")) {
  199. parentNums = parentNum.split(" - ");
  200. } else if (parentNum.contains(" to ")) {
  201. parentNums = parentNum.split(" to ");
  202. } else if (parentNum.contains("或")) {
  203. parentNums = parentNum.split("或");
  204. } else {
  205. parentNums = new String[0];
  206. }
  207. StringBuilder builder = new StringBuilder();
  208. for (int j = Integer.parseInt(parentNums[0]) - 1; j < Integer.parseInt(parentNums[parentNums.length - 1]); j++) {
  209. if ((builder + "").equals("")) {
  210. builder.append(j);
  211. } else {
  212. builder.append(",").append(j);
  213. }
  214. }
  215. PatentRight patentRight = new PatentRight()
  216. .setPatentId(params.getPatentId())
  217. .setType(0)
  218. .setContent(strs[i])
  219. .setSort(i)
  220. .setParentSort(builder + "");
  221. if (strsOut.length - 1 >= i) {
  222. patentRight.setContentOut(strsOut[i]);
  223. }
  224. patentRights.add(patentRight);
  225. } else if (matcher1.find()) {
  226. String parentNum = matcher1.group().substring(matcher1.group().indexOf("m") + 2);
  227. PatentRight patentRight = new PatentRight()
  228. .setPatentId(params.getPatentId())
  229. .setType(0)
  230. .setContent(strs[i])
  231. .setSort(i)
  232. .setParentSort((Integer.parseInt(parentNum) - 1) + "");
  233. if (strsOut.length - 1 >= i) {
  234. patentRight.setContentOut(strsOut[i]);
  235. }
  236. patentRights.add(patentRight);
  237. }
  238. } else {
  239. PatentRight patentRight = new PatentRight()
  240. .setPatentId(params.getPatentId())
  241. .setType(1)
  242. .setContent(strs[i])
  243. .setSort(i)
  244. .setParentSort("-1");
  245. if (strsOut.length - 1 >= i) {
  246. patentRight.setContentOut(strsOut[i]);
  247. }
  248. patentRights.add(patentRight);
  249. }
  250. }
  251. }
  252. return patentRights;
  253. }
  254. }