使用Regex查找单词之间的特定文本

时间:2018-02-22 23:16:36

标签: javascript java regex regex-lookarounds regular-language

我试图替换一些字符串,但我的条件是该字符串必须位于"标记"内。 我怎么能用正则表达式做到这一点?

例如:

Text multiline, bla bla bla **FOO** text text text 
*START_TAG* text text  text text **FOO** a lot of texts
**FOO**  more text
*END_TAG*

我想替换 START_TAG END_TAG

之间的 FOO 文字

我尝试过这样的事情:

(?<=word1)(.*?)(?=word2)

(?<=word1)FOO(?=word2)

但是在第一种情况下,我得到了标签内的所有内容,而在第二种情况下,没有找到任何内容。

我搜索了很多,但人们用来搜索括号内的字符串或单词之间的所有文字等。

我使用Java执行此操作,但也可以使用javascript。

1 个答案:

答案 0 :(得分:1)

在Java中,您可以使用像

这样的一个正则表达式解决方案
String result = s.replaceAll("((?:\\G(?!\\A)|START_TAG)(?:(?!START_TAG|FOO).)*?)FOO(?=.*END_TAG)", "$1<REPLACED>");

请参阅regex demo

<强>详情

  • ((?:\\G(?!\\A)|START_TAG)(?:(?!START_TAG|FOO).)*?) - 第1组:
    • (?:\\G(?!\\A)|START_TAG) - 上一场比赛结束或START_TAG
    • (?:(?!START_TAG|FOO).)*?) - 任何char,0+重复,尽可能少,不会启动START_TAGFOO字符序列
  • FOO - FOO匹配并替换
  • (?=.*END_TAG) - 检查当前位置右侧是END_TAG的正向前瞻。

在JS中,两步替换似乎是最好的:

var rx = /START_TAG[\s\S]*?END_TAG/g;
var str = "Text multiline, bla bla bla **FOO** text text text *START_TAG* text text text text **FOO** a lot of texts\n**FOO**  more text\n*END_TAG*";
var result = str.replace(rx, function ($0) {return $0.replace(/FOO/g, "<REPLACED>");} );
console.log(result);