【问题标题】:regex to find variables surrounded by % in a string正则表达式在字符串中查找由 % 包围的变量
【发布时间】:2018-11-04 03:29:13
【问题描述】:

需要在字符串中查找“变量”。表示变量的是 %[/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,等等on... 这是给定字符串的所需输出:

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

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

【问题讨论】:

  • 那么%%可以嵌套吗?如果是这种情况,正则表达式无法处理,您将需要一个解析器。
  • 我看不到 %\w+% 哪里没有 match as expected.
  • 为什么要使用井号 # 而需要百分比 %
  • 这个正则表达式 %(\w+)% 有什么问题?

标签: java regex string regex-lookarounds regex-group


【解决方案1】:

如果您想匹配 3 个捕获组中的变量,并且不想匹配 %%,您可以使用替换 | 来匹配 %% 并使用 3 个捕获组捕获变量:

%%|(%)(\w+)(%)

Demo Java

【讨论】:

    【解决方案2】:

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

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

    这将找到每边都被单个 % 字符包围的变量。

    测试正则表达式here


    Java 代码:

    final Pattern pattern = Pattern.compile("(?<!%%)(?<=%)\\w+(?=%)(?!%%)");
    final Matcher matcher = pattern.matcher(input);
    
    while (matcher.find()) {
        System.out.println(matcher.group(0));
    }
    

    测试Java代码here


    更新:

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

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

    测试这个模式here


    ...和 ​​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));
    }    
    

    测试此代码here

    【讨论】:

    • 我的最终目标是拥有三个组,0、1 和 2,其中第 0 组是开始百分比,第 1 组是内部文本,第 2 组是结束百分比。在您的 java 示例中,它只有一个组,相当于我想成为第 1 组。您如何更改正则表达式,以便有三个组?
    • @SamCarleton - group(0) 始终代表整个模式/匹配。捕获组从索引号 1 开始:group(1)group(2)group(3)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多