我试图想出一种在配置文件中匹配域名的方法。我的文件可能如下所示:
<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,所以我的正则表达式不起作用。我该如何纠正?
答案 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
必须是其中的一部分。
我们正在寻找哪些部件?
[a-z]+\.
转义点,因此它是字面值而不是“任何字符”。([a-z]+\.)*
(\.[a-z]+)*
>
<
末尾的所有内容以及结束标记的开头>something<
...所以>([a-z]+\.)*abc\.com(\.[a-z]+)*<
将所有内容放在一起,我们得到">([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)