如何从一组文本中提取子字符串?

3
我从PDF文档中提取了文本。我想使用Java提取其中的一些特定字段。
文本部分如下:
US00RE44697E (i9) United States (12) Reissued Patent (10) Patent Number: RE44,697 E Jones et al. (45) Date of ReissuedPatent: Jan. 7, 2014 (54) ENCRYPTIONPROCESSORWITH SHARED MEMORY INTERCONNECT (75) Inventors: David E.Jones, Ottawa (CA); Cormac M.O'Connell, Carp (CA) (73) Assignee: Mosaid Technologies Incorporated, Ottawa, Ontario (CA) (21) Appl.No.: 13/603,137 (22) Filed: Sep. 4, 2012 Related U.S. Patent Documents Reissue of: (64) Patent No.: Issued: Appl. No.: Filed: 6,088,800 Jul. 11, 2000 09/032,029 Feb. 27, 1998 (51) Int.CI. G06F 21/00 (2013.01) (52) U.S. CI. USPC .............713/189; 713/190; 713/193; 380/28; 380/33; 380/52 (58) Field of Classification Search None 现在我的任务是从中提取字段并将其赋值给字符串,即:
文本`(10) Patent Number: RE44,697 E`将被提取为`String pat_no= " RE44,697 E"`。
文本`(54)ENCRYPTIONPROCESSORWITH SHARED MEMORY INTERCONNECT`将被提取为`String title= "ENCRYPTIONPROCESSORWITH SHARED MEMORY INTERCONNECT"`。
极不规则的文本块:
(64) Patent No.: Issued: Appl. No.: Filed: 6,088,800 Jul. 11, 2000 09/032,029 Feb. 27, 1998
必须被提取为:
String pat_no_org = "6,088,800";
String issued = "jul.11,2000" 
String filed = "feb 27 ,1998"
......

像这样..

我的工作

首先我使用了string.split,string.substring,string.indexof甚至apache string utils,但都没有帮助..因为文本是分散的,上面的方法都没有帮助..我也尝试过正则表达式,但由于我对它非常薄弱,我无法编程。请告诉我如何使用java实现我的目标?


欢迎来到stackoverflow!我认为如果您发布您尝试过的正则表达式并写明失败的地方,这将会有所帮助。 - bdecaf
2
我读了这个网站并尝试了一些,但是遇到了困难。 - Ajay Nair
1个回答

2
使用正则表达式,我会将其分成三个部分:
1.) (10) 专利号 的正则表达式可能是这样的:
\(10\)\s*Patent Number:\s*([\w,]+)

作为Java字符串:
"\\(10\\)\\s*Patent Number:\\s*([\\w,]+)"

第一个括号组的匹配项将在[1]中。

  • \s空白字符速记符号,等价于[ \t\r\n\f]
  • \w单词字符速记符号,包括[A-Za-z0-9_],字符类中。
  • 一些字符在正则表达式中有特殊含义。它们需要用反斜杠进行转义。

2.) (54) 加密...

一个模式可能看起来像:

(?s)\(54\)\s*(.*?)\s*(?=\(\d|$\))

作为Java字符串:
"(?s)\\(54\\)\\s*(.*?)\\s*(?=\\(\\d|$\\))"
  • (?s) “s”修饰符 等同于 Pattern.DOTALL,使点号匹配换行符。
  • (?=\(\d|$\)) 使用前瞻匹配(.*?) 惰性匹配任意数量的任意字符,直到遇到另一个以数字(开头或字符串结尾$锚定结尾)的字符。

对于其他3个所需的部分,我会尝试反映输入的格式与模式相匹配。这需要确保所有数据都是兼容的。一个模式可能是这样的:
(?s)\(64\).*?Filed:\s*([\d,]+)\s*(\w+\.\s*\d+,\s*\d+)\s*\n[\d+][^\n]+\n\s*(\w+\.\s*\d+,\s*\d+)

作为Java字符串:
"(?s)\\(64\\).*?Filed:\\s*([\\d,]+)\\s*(\\w+\\.\\s*\\d+,\\s*\\d+)\\s*\\n[\\d+][^\\n]+\\n\\s*(\\w+\\.\\s*\\d+,\\s*\\d+)"
  • \n 匹配换行符。

匹配结果将在 [1] 中,例如:6,088,800[2] 中的 Jul. 11, 2000[3] 中的 Feb. 27, 1998

对于刚开始学习正则表达式的人来说,这些信息可能有点过多 :)


3
感谢您详细的回答,@Jonny 5。 - Ajay Nair
在Stack上,我们接受并点赞,而不是道谢 :) - MariuszS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接