分隔符之间的正则表达式匹配

时间:2017-06-19 23:43:48

标签: java regex replace

我试图想出一种在配置文件中匹配域名的方法。我的文件可能如下所示:

<abc="xyz">abc.com</abc>

我想匹配abc.com并将其替换为占位符文本。我目前的Java解决方案是通过调用StrName.replace(“abc.com”,“random”)替换文本中的确切域名 但是,它也会将abc.commmmm替换为randommmmm。我不希望这样。所以,我尝试了正则表达式。但是,我的正则表达式[.><](abc.com)[.<>]也会在字符串中选择> and <。我不希望这样。我也意识到文本可能是这样的:

<abc="xyz">text.abc.com.net</abc>

我仍然想要替换abc.com,所以我的正则表达式不起作用。我该如何纠正?

2 个答案:

答案 0 :(得分:1)

您可能需要考虑在正则表达式中使用正面前瞻和正面后瞻。请参阅:http://www.regular-expressions.info/lookaround.html

正向预测与THING1(?=THING2)类似,表示查找THING1后跟THING2

正面观察与(?<=THING1)THING2类似,表示查找THING2后跟THING1

在这两种情况下,前瞻中的THING都不会被消耗掉。对于您的第一个示例,您可以执行以下操作: (?<=>)abc\.com(?=<)

意思是abc.com前面带有&gt;来自(?<=>),然后是&lt;来自(?=<)

如果您还希望在text.abc.com等期间替换abc.com,您可以尝试:

(?<=[.><])abc\.com(?=[.><])

意思是abc.com前面是&lt;,&gt;要么 。来自(?<=[.><]),后跟&lt;,&gt;要么 。来自(?=[.><])

这将为您提供<abc="xyz">random</abc><abc="xyz">text.random.net</abc>两个示例,以及<abc="xyz">abc.commmm</abc>

的匹配项

注意:使用\.代替.来延长期限,否则您将匹配abcdcom.匹配任何字符。请参阅:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

答案 1 :(得分:0)

除了使用环视之外,您还可以使用标准捕获组执行此操作。

首先,定义你要找的东西......

  

abc.com>中附带的<标记内找到abc.com   并且可选地具有附加的点缀前缀和/或后缀   在这些情况下找到时,将random替换为abc.com

我认为这是一个包含两个或更多细分的多级域名,abc\.com必须是其中的一部分。

我们正在寻找哪些部件?

  1. 固定字符串 abc.com - 其中的重要内容是[a-z]+\.转义点,因此它是字面值而不是“任何字符”。
  2. 可选的域名位于“abc.com”之前 - 字母后跟点([a-z]+\.)*
    ...但是或更多可以为零,所以(\.[a-z]+)*
  3. 可选的域部件跟随“abc.com” - 一个点后跟字母,零
    或更多次>
  4. 包含在开始标记<末尾的所有内容以及结束标记的开头>something< ...所以>([a-z]+\.)*abc\.com(\.[a-z]+)*<
  5. 将所有内容放在一起,我们得到">([a-z]+\\.)*abc\\.com(\\.[a-z]+)*<",需要将其转义为Java字符串>

    现在,由于我们正在匹配并使用<>$1random$2<,我们将在替换字符串中使用它们,并且我们捕获前缀和后缀,以便我们还需要使用捕获组1和2将这些替换为替换,并给出<abc="xyz">abc.com</abc> => <abc="xyz">random</abc> <abc="xyz">abc.commmmm</abc> => <abc="xyz">abc.commmmm</abc> <abc="xyz">text.abc.com.net</abc> => <abc="xyz">text.random.net</abc> [abc="xyz"]text.abc.com.net[/abc] => [abc="xyz"]text.abc.com.net[/abc] <abc="xyz">abc-com</abc> => <abc="xyz">abc-com</abc> <abc="xyz">abc.com.fr</abc> => <abc="xyz">random.fr</abc> <abc="xyz">www.abc.com</abc> => <abc="xyz">www.random</abc>

    我将此 re 放在regexplanet.com http://fiddle.re/fxhfxn中,使用这些测试字符串并生成替换字符串:

    SELECT c FROM NewCompounds c 
    LEFT JOIN NewCompoundsKegg ck on c.compoundId=ck.compoundId 
    LEFT JOIN NewCompoundsHMDB ch on c.compoundId=ch.compoundId 
    where (ck.keggId is not null or ch.hmdbId is not null) 
    and (c.mass >= 236.08001738701788 and c.mass <= 236.0941826129821)