【问题标题】:find substring using match regex使用匹配正则表达式查找子字符串
【发布时间】:2014-11-26 22:00:10
【问题描述】:

使用正则表达式如何在其他字符串中查找子字符串。这里有两个字符串:

String a= "?drug <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/possibleDiseaseTarget> ?disease .";

String b = "?drug <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/molecularWeightAverage> ?weight . ?drug <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/possibleDiseaseTarget> ?disease";

我只想匹配

&lt;http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/possibleDiseaseTarget&gt;

【问题讨论】:

  • 当contains 存在时,为什么你特别需要一个正则表达式?
  • 它根本不起作用:(
  • 我们能看看have you done so far to solve this problem是什么吗?
  • 刚刚使用 if(b.contains(a)){}
  • @QaiserMehmood :它工作得非常好,事实是 b 不包含 a。去掉a中的最后一个点和空格,它会返回true。

标签: java regex


【解决方案1】:

由于这不是完全 HTML 并且任何 XML/HTML 解析器都无法帮助它,您可以尝试使用 regex。看来您想在表单中查找文本

?drug <someData> ?disease

要描述此类文本正则表达式,您需要转义 ?(它是表示 optional 的正则表达式特殊字符之一 - 零或一次 - 量词),因此您需要在前面放置 \它(在 String 中需要写成"\\")。
&lt;someData&gt; 部分也可以写成&lt;[^&gt;]&gt;,这意味着,

  • &lt;,
  • 后面有一个或多个非&gt;,
  • 最后是&gt;

所以匹配?drug &lt;someData&gt; ?disease的正则表达式可以写成

"\\?drug &lt;[^&gt;]+&gt; \\?disease"

但由于我们只对代表&lt;someData&gt; 的部分&lt;[^&gt;]+&gt; 感兴趣,我们需要让正则表达式group 创建竞争。简而言之,如果我们将正则表达式的某些部分用括号括起来,那么与该正则表达式部分匹配的字符串将被放置在我们称为组的东西中,因此我们将能够从该组中获取部分。简而言之,最终的正则表达式看起来像

"\\?drug (<[^>]+>) \\?disease"
         ^^^^^^^^^---first group, 

并且可以像

一样使用
String a = "?drug <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/possibleDiseaseTarget> ?disease .";
String b = "?drug <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/molecularWeightAverage> ?weight . ?drug <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/possibleDiseaseTarget> ?disease";

Pattern p = Pattern.compile("\\?drug (<[^>]+>) \\?disease");
Matcher m = p.matcher(a);
while (m.find()) {
    System.out.println(m.group(1));
}
System.out.println("-----------");
m = p.matcher(b);
while (m.find()) {
    System.out.println(m.group(1));
}

这将作为输出产生

<http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/possibleDiseaseTarget>
-----------
<http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/possibleDiseaseTarget>

【讨论】:

    【解决方案2】:

    这里不需要使用正则表达式,只需这样做:

    String substr = "<http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/possibleDiseaseTarget>";
    System.out.println(b.contains(substr)); // prints true
    System.out.println(a.contains(substr)); // prints true
    

    【讨论】:

    • 它不是完整的字符串,而是“a”的一部分。我想要的是匹配完整的字符串或字符串“a”的某些部分。但是,我通过采用“a”的子字符串(开始,结束)解决了这个问题,它现在匹配了。
    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2013-04-13
    • 2022-07-11
    相关资源
    最近更新 更多