【问题标题】:Matches lines not starting by Date匹配不以日期开头的行
【发布时间】:2019-08-27 14:16:59
【问题描述】:

我从 pdf 文件中提取了一些文本,我正在寻找一些关键字来匹配职位,我尝试使用许多正则表达式来仅获取不以日期开头的行(任何日期格式)但我必须获取以任何其他数字或单词开头的其他行。

我希望在这里找到一个聪明的想法。 最好的

我已经尝试了这两个正则表达式来找到 ingenieur 关键字但没有任何成功:


    ((?m)^(?![0-9])\\s*\\b"+ sTofind +"\\b)

还有这个:


    ((?m)[^(?!(0-9))][\\s{2,4}]\\b"+ sTofind +"\\b.*)

我使用的文本测试是这个(> 字符不是文本的一部分):

etudiant -: ingenieur etudes et developpement
http://www.doyoubuzz.com/profilen
experiences  
ingenieur
2018-2014      ingenieur 
331    ingenieur


29 rue de la terrasse    Ingenieur Centrale Lyon / Supélec 
93160 NOISY LE GRAND    ingenieur  
09 66 11 10 93       Expertise en instrumentation industrielle, 
06 44 25 90 09     automatisation ingenieur & marketing opérationnel 
email.email@wanadoo.fr   Bilingue anglais  ingenieur

我希望找到突出显示的文本:

etudiant -: <i>ingenieur etudes et developpement</i>
http://www.doyoubuzz.com/profilen
<i>experiences</i>
<i>ingenieur</i>
2018-2014      ingenieur 
331    <i>ingenieur</i>


29 rue de la terrasse    <i>Ingenieur Centrale Lyon / Supélec </i>
93160 NOISY LE GRAND    <i>ingenieur</i>  
09 66 11 10 93       Expertise en instrumentation industrielle, 
06 44 25 90 09     automatisation <i>ingenieur & marketing opérationnel </i>
email.email@wanadoo.fr   Bilingue anglais  <i>ingenieur</i>

【问题讨论】:

标签: java regex regex-negation regex-lookarounds


【解决方案1】:

你可能会使用:

(?mi)^((?![0-9]+-[0-9]+).*?)(\bingenieur\b.*)

关于模式

  • (?mi) 多行和不区分大小写的标志
  • ^ 字符串开头
  • (抓包组
    • (?! 负前瞻,断言右边立即不是
      • [0-9]+-[0-9]+ 匹配 1+ 位数字、连字符和 1+ 位数字
    • ).*? 关闭负前瞻并匹配除换行符以外的任何字符非贪婪
  • )关闭捕获组
  • (\bingenieur\b.*) 捕获在单词边界之间匹配工程师直到字符串末尾的组

您可以在代码中使用启用多行和不区分大小写的标志,例如:

String sTofind = "ingenieur";
String regex = "^((?!>[0-9]+-[0-9]+).*?)(\\b"+ sTofind + "\\b.*)";
String string = "...";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(string);
String result = matcher.replaceAll(subst);

Regex demo | Java demo

如果您还想突出显示,也可以将工程师替换为 experiences

并替换为 2 个捕获组,您可以在其中突出显示第二组:

$1&lt;i&gt;$2&lt;/i&gt;

【讨论】:

  • 抱歉我的错误,> 字符不是文本的一部分,我认为你的解决方案是迄今为止最好的,所以我可以让第二组 2 从关键字中获取匹配。谢谢你的回答,我会等待其他答案,如果没有更多的最佳答案,我会检查你的最佳答案。
  • 如果&gt; 不是文本的一部分,您可以从模式String regex = "^((?![0-9]+-[0-9]+).*?)(\\b"+ sTofind + "\\b.*)"; 中省略它
  • 是的,这就是我所做的,我认为它的工作原理,你的反应是最好的。我会将其标记为已回答。非常感谢
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
相关资源
最近更新 更多