首页 > 解决方案 > 正则表达式在字符串中查找由 % 包围的变量

问题描述

需要在字符串中找到“变量”。表示变量的是 %[/w]+%,关键是字符串中可以有多个变量:

%ABC%
%ABC%-%RED%
Lorem ipsum %GeT% sit amet, %% consectetur %QW23% elit. 

在第三个示例中,不应找到 %%,它将替换为单个 %。#[\w+-]+# 之类的东西不起作用,因为它无法确定在第二行中它是 %ABC% 和 %RED%,而是 %-%。我的印象是需要同时使用组和反向引用,但我找不到任何好的例子来解释如何在 Java 中做到这一点。


人们正在寻求一些问题的答案,所以你去:

我期望的最终输出到底是什么?好吧,正如主题所暗示的 %ABC% 是在其他地方定义的“变量”,最终目标是“找到变量并用正确的值替换它”。正则表达式的目标是查找字符串中的所有“变量”。

因此,内存中某处有一张地图,其中:

ABC = "mike"
RED = "Red Storm"
GeT = "hometown"
QW23 = "Quick and easy"

(旁注:如果键需要在名称周围有 % ,那也可以)

正则表达式的目标是“找到”变量,因此在第一个字符串中它将找到 ABC(或 %ABC%),以便代码和查找 ABC 以确定正确的值是 mike,等等。 . 这是给定字符串的期望输出:

mike
mike-Red Storm
Lorem ipsum hometown sit amet, % consectetur Quick and easy elit. 

我并不期望 reg 表达式实际上进行完全替换,而只是找到片段以便其他代码进行替换。我也不指望它将 %% 转换为 %,但不要管它,以便事后简单搜索 %% 可以将其转换为 %。

标签: javaregexstringregex-lookaroundsregex-group

解决方案


我相信您正在寻找正则表达式模式

(?<!%%)(?<=%)\w+(?=%)(?!%%)

%这将找到在每一侧被单个字符包围的变量。

在这里测试正则表达式。


Java代码:

final Pattern pattern = Pattern.compile("(?<!%%)(?<=%)\\w+(?=%)(?!%%)");
final Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    System.out.println(matcher.group(0));
}

在此处测试 Java 代码。


更新:

如果您想按照下面评论中的要求捕获组,请使用以下模式:

(?<!%)(%)(\w+)(%)(?!%)

在这里测试这个模式。


...和Java代码:

final Pattern pattern = Pattern.compile("(?<!%)(%)(\\w+)(%)(?!%)");
final Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    System.out.println(matcher.group(1) + " | " + 
                       matcher.group(2) + " | " + 
                       matcher.group(3));
}    

在此处测试此代码。


推荐阅读