【问题标题】:Extracting contents of placeholders inside curly braces prefixed with dollar symbol提取以美元符号为前缀的花括号内的占位符内容
【发布时间】:2021-11-18 22:31:30
【问题描述】:

假设我有一个字符串"lore epsum dimsum ${ITEM_NAME} wonton kimchi"

我创建了一个正则表达式,可以从字符串中的任何位置提取${ITEM_NAME}。那个正则表达式是.{(.*.*)}

如何自定义此正则表达式以仅提取 ${} 之间的字符串 ITEM_NAME

【问题讨论】:

  • 这是一个String regex = "\\$\\{([^{}]*)\\}";
  • 原方案出现lore epsum dimsum ${ITEM_NAME} wonton ${ANOTHER_NAME} kimchi之类的字符串有问题,Wiktor的方案更好。

标签: java regex


【解决方案1】:

使用{(.*.*)} 模式,您可以提取最左边的{ 和最右边的} 之间的任何子字符串。

你需要

\$\{([^{}]*)\}

在 Java 中:

String regex = "\\$\\{([^{}]*)\\}";

请参阅regex demo

如果明确要求仅匹配 ${...} 内的字母数字/下划线字符,您可以将 [^{}]* 替换为 \w+ / \w* 模式(Java 字符串文字中的反斜杠加倍)。

Java demo

import java.util.*;
import java.util.regex.*;

class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String text = "lore epsum dimsum ${ITEM_NAME} wonton kimchi ${ITEM_NAME_2}";
        Pattern p = Pattern.compile("\\$\\{([^{}]*)}");
        Matcher m = p.matcher(text);
        List<String> res = new ArrayList<>();
        while(m.find()) {
            res.add(m.group(1));
        }
        System.out.println(res);
    }
}

输出:

[ITEM_NAME, ITEM_NAME_2]

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 2019-07-18
    • 2019-05-14
    • 2019-02-07
    • 2017-02-22
    • 2021-09-02
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多