Java 带占位符的正则表达式

Java 带占位符的正则表达式,java,regex,Java,Regex,我有这样一个字符串:“嗨$namevar$你好吗?”。我想: 提取占位符名称 将此字符串与另一个字符串匹配,例如“Hi jhon doe你好吗?” 从测试字符串中提取“namevar”部分 对于1)我使用以下代码: String my = "hi $namevar$ how are you?"; Matcher m = Pattern.compile("\\$(\\w.*?)\\$").matcher(my); while (m.find()) { System.out.println(

我有这样一个字符串:“嗨$namevar$你好吗?”。我想:

  • 提取占位符名称
  • 将此字符串与另一个字符串匹配,例如“Hi jhon doe你好吗?”
  • 从测试字符串中提取“namevar”部分
  • 对于1)我使用以下代码:

    String my = "hi $namevar$ how are you?";
    Matcher m = Pattern.compile("\\$(\\w.*?)\\$").matcher(my);
    while (m.find()) {
        System.out.println(m.group(1));
    }
    
    有关于2)和3)的提示吗?

    试试以下方法:

    String mydata = "hi john how are you?";
    System.out.println(mydata.matches("hi (.*?) how are you\\?"));//requirement 2
    Pattern pattern = Pattern.compile("hi (.*?) how are you?");
    Matcher matcher = pattern.matcher(mydata);
    if (matcher.find()) {
        System.out.println(matcher.group(1));//requirement 3
    }
    Output:
    true
    john
    

    这里有一种更通用的方法,它不需要您提供模式,适用于多个占位符,也可以在多个单词上匹配占位符。例如,我们有以下模板和输入字符串:

    String input = "Hi John Doe, how are you? I'm Jane.";
    String template = "Hi $namevar$, how are you? I'm $namevar2$.";
    
    因此,我们首先解析所有占位符名称并将它们添加到
    映射中。我们使用
    映射
    ,以便以后可以将实际的
    字符串
    值指定为键

    Matcher m = Pattern.compile("\\$(\\w*?)\\$").matcher(template);
    Map<String, String> vars = new LinkedHashMap<String, String>();
    while (m.find()) {
        System.out.println(m.group(1));
        vars.put(m.group(1), null);
    }
    
    现在,我们进行匹配并捕获占位符值。然后将这些值存储在上面创建的相同的
    映射中,并分配给相应的占位符变量

    m = Pattern.compile(pattern).matcher(input);
    if (m.matches()) {
        int i = 0;
        for (String var : vars.keySet()) {
            vars.put(var, m.group(++i));
        }
    }
    
    现在,让我们通过迭代
    Map
    as来打印捕获的值

    for (Map.Entry<String, String> entry : vars.entrySet()) {
        System.out.println(entry.getKey() + " = " + entry.getValue());
    }
    

    2,3规则对我来说不清楚。你能提供预期的输出吗?对于2)如果字符串是“hi john doe你好吗?”那么任何字符都是$namevar$。对于3)我想获得namevar=“john doe”您是否仍然对更通用的解决方案感兴趣,或者您的所有要求都已得到满足?@RaviThapliyal通用解决方案会很好。@greywolf82添加了我对您的要求2和3的看法。我如何修改您的代码以使用多个占位符?
    String mydata=“你好,约翰,格雷沃尔夫先生,你好吗?”;Pattern Pattern=Pattern.compile(“你好(.*)你好(.*)\\?”);Matcher Matcher=Pattern.Matcher(mydata);if(Matcher.find()){int count=Matcher.groupCount();for(int i=1;i
    
    for (Map.Entry<String, String> entry : vars.entrySet()) {
        System.out.println(entry.getKey() + " = " + entry.getValue());
    }
    
    namevar = John Doe
    namevar2 = Jane