javascript - 使用正则表达式查找单词之间的特定文本

标签 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_TAGEND_TAG 之间的 FOO 文本>

我试过这样做:

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

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

但在第一种情况下,我得到了标签中的所有内容,而在第二种情况下,什么也找不到。

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

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

最佳答案

在 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).)*?) - 任何字符,重复 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);

关于javascript - 使用正则表达式查找单词之间的特定文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48938802/

相关文章:

javascript - 传递方法作为回调

javascript - 如何在 React Native 中绘制多色圆圈?

javascript - KnockoutJS - 在父标记中绑定(bind)子组件的点击事件

java - java.util.concurrent.ConcurrentHashMap.putIfAbsent 是否需要在同步块(synchronized block)中?

javascript - 正则表达式匹配特定长度的特定数字组?

javascript - 让卡片排序到左上角

Java 支持 WS-Fed 与 SAML 作为登录协议(protocol)

java - 在外部 Java 库之后清理

javascript - JS 中的命名组和 OR 运算符

regex - 我如何用正则表达式 "match until a pattern without including that pattern"表达?