当前位置: 首页 > 知识库问答 >
问题:

正则表达式用字符串之间的给定匹配替换字符

华聪
2023-03-14

我试图用正则表达式匹配替换给定的字符。例如,给定以下字符串:
如果你看看你生活中拥有的,你总是会拥有更多。如果你看看你生活中没有的,你永远不会有足够的
我想用“!”替换所有的“t”,只有在字符“ok”和“fe”之间匹配的情况下。

我用这个正则表达式得到“ok”和“fe”之间的匹配:

(?<=ok).*?(?=fe)

并且我只能将一个字符与以下正则表达式匹配:

(?<=ok).*?(t).*?(?=fe)

我试图用以下方式转换正则表达式,但它不起作用:

(?<=ok).*?((t).*?)*?(?=fe)

我怎样才能在ok和fe之间匹配所有的t?https://regex101.com/r/ORgseA/1

共有1个答案

暴骏奇
2023-03-14

你可以用

String result = text.replaceAll("(?s)(\\G(?!\\A)|ok)((?:(?!ok|fe|t).)*)t(?=(?:(?!ok|fe).)*fe)", "$1$2!");

请参阅正则表达式演示和Java演示:

String text = "If you look at what you have in life, you'll always have more. If you look at what you don't have in life, you'll never have enough";
String result = text.replaceAll("(?s)(\\G(?!\\A)|ok)((?:(?!ok|fe|t).)*)t(?=(?:(?!ok|fe).)*fe)", "$1$2!");
System.out.println(result);
// => If you look a! wha! you have in life, you'll always have more. If you look a! wha! you don'! have in life, you'll never have enough

详情:

  • (? s)-模式。DOTALL嵌入标志选项(使.匹配换行符)
  • (\G(?!\A)|ok)-第1组(1美元):ok或上一次成功匹配的结束
  • ((?:(?! ok|fe|t).)*)-Group 2(2$):任意一个char,零次或多次出现,尽可能多,即不启动一个okfetchar序列
  • t-一个tchar
  • (? =(?:(?! ok|fe)。)*fe)-在右侧,必须有任何单个字符,零次或多次出现,尽可能多,不启动okfe字符序列,然后是fe子字符串。
 类似资料:
  • 问题内容: 我有以下几种可能的形式的字符串: 我希望能够将它正则化为,基本上替换和之间的所有内容。我试过了: 但这是行不通的。任何帮助表示赞赏。 PS 表示有一个换行符用于此目的。实际上不在那里。 问题答案: 您可以使用 并替换为。请参阅在线Go regex演示。 在这里,匹配并捕获子字符串(它将从替换模式中引用此值),并将匹配并消耗除换行符以外的任何0+字符,直至行尾。 参见Go演示: 输出:

  • 我想匹配任何文本中的某些行,在匹配中,我想尽可能频繁地替换某个字符。示例文本: 任何文本和“更多”文本。不要在此处替换引号 CatchThis(此处没有引号,“任何更多文本”,“等等…”)。。。 现在,我想用哈希符号来替换圆括号中的每个引号。预期结果: 任何文本和“更多”文本。不要在此处替换引号 CatchThis(此处没有引号,#没有更多文本#,#等等…#)。。。 匹配线条很容易。这是我的模式:

  • 我有一根绳子。假设:< br> 我想将所有替换为单词和替换为。一般来说,我想替换单个字母或单个字母与空格或点之间的所有点。我认为匹配的正则表达式是: 我怎么能只替换那个点,而不是所有匹配的东西? 编辑: 预期产出: 编辑2: 基本任务是从缩写和首字母缩略词中删除点,这些缩略词可以用点或不用点编写。所以一个好的正则表达式也很有价值

  • https:www.google。com/;ParamName=项目;AccessKey=PDJKJDSJJKNEIOWEMCL/dsjdkhfjf=;值=xyz 在这里,我想用一些虚拟字符串替换值并返回整个字符串。 预期输出:<代码>https:www.google。com/;ParamName=项目;AccessKey=dummyValueHere;值=xyz 是否有人可以通过使用replac

  • 问题内容: 我有以下字符串: 如您所见,该字符串由#分隔。我的用例类似于一个简单的SPLIT(string,“#”)操作,但是regex给了我更多的灵活性。 我想匹配两次出现的#之间的字符。例如,第二次和第三次出现之间的字符应匹配:“ US” 我使用的是Google Bigquery,能够匹配字符串的前两个术语,但与第三个术语比较费劲: 位置是字符串,例如上面的字符串。 我已经找到了这个问题,但是

  • 问题内容: 我在尝试将我的javascript regex经验转移到Python时遇到了麻烦。 我只是想让它工作: …但是它打印无。如果我做: 它匹配…默认情况下是否匹配字符串的开头?当匹配时,如何使用结果? 我如何进行第一场比赛?是否有比python网站提供的文档更好的文档? 问题答案: 隐式添加到您的正则表达式的开头。换句话说,它仅在字符串的开头匹配。 将在所有位置重试。 一般来说,建议您在需