【问题标题】:Find specific text between words using Regex使用正则表达式查找单词之间的特定文本
【发布时间】:2018-08-02 23:24:58
【问题描述】:

我正在尝试替换一些字符串,但我的条件是该字符串必须在“标签”内。 我怎么能用正则表达式做到这一点?

例如:

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,对吧?标记时请具体说明。
  • 对不起。刚刚添加。
  • 解决方案可以相同,但对于 Java,只有一个正则表达式解决方案。您想替换这些单词之间出现的所有FOO吗?
  • 是的……没错。
  • 因为我从文件中读取了一个字符串,我必须保持它不变,除了这个词。

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


【解决方案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).)*?) - 任何不启动 START_TAGFOO 字符序列的字符,0+ 次重复,尽可能少
  • 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);

【讨论】:

  • 刚刚测试,差不多了。唯一的问题是像 FOOTER 或 FOOBAR 这样的词也会被改变。 (顺便说一句,从 start_tag 开始,正则表达式演示非常重要)
  • @VictorBello 是的,它确实从 start_tag 中“突出显示”,因为正则表达式会消耗该标签和上一个匹配结束直到 Foot 的所有内容。您需要保留的内容就是这样捕获的。需要去的才刚刚匹配。
  • 是的...我使用 Java Matcher 来查看组,它从最后一个到 FOO。问题是它可能会找到以 FOO 开头、结尾或在单词中间的单词。有什么想法可以避免这种情况吗?
  • @VictorBello 你的意思是你需要匹配由字母/数字/_组成的整个单词吗?使用\\bFOO\\b
猜你喜欢
  • 2022-08-18
  • 2017-02-03
  • 1970-01-01
  • 2022-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多