使用Regex查找模式并将其替换为已处理的数据 - java

有以下格式的输入字符串

$ {} ENC: 107ec5141234742beec5cb5b1917e2e6 :{} ENC $$ {} ENC: d0b2ddf0b9e7b397558c20c6232 37c4f:{} ENC $$ {} ENC: 85d6f3cd7dcc5c67cad68ae45a0d5afc :{} ENC $$ {} ENC: 5c0dfb55a843f830 024df0d74993b668 :{ENC} $

如您所见,数据(粗体)以 $ {ENC}为前缀:,并以:{ENC} $ 为后缀。我想用处理过的数据替换它们之间的所有字符串。

我正在使用正则表达式:

\$\{ENC\}\:(.*?)\:\{ENC\}\$

转义为Java之后:

\\$\\{ENC\\}\\:(.*?)\\:\\{ENC\\}\\$

查找匹配项并替换字符串。

我的代码示例如下:

String THE_REGEX = "\\$\\{ENC\\}\\:(.*?)\\:\\{ENC\\}\\$";
Pattern THE_PATTERN = Pattern.compile(THE_REGEX);

public static boolean isProcessingRequired(String data){
      if(data == null){
          return false;
      }

      return data.matches(THE_REGEX);
}


public String getProcessedString(String dataString){


    Matcher matcher = THE_PATTERN.matcher(dataString);
    if(matcher.matches()){

        String processedData = null;
        String dataItem = matcher.group(1);
        String procItem =  doSomeProcessing(dataItem);

        processedData = dataString.replaceAll("\\$\\{ENC\\}:" + encData + ":\\{ENC\\}\\$", procItem);

        if(isProcessingRequired(processedData)){
            processedData = getProcessedString(processedData);
        }

        return processedData;
    } else {
        return dataString;
    }
}

public String doSomeProcessing(String str){

     // do some processing on the string
     // for now:
       str = "DONE PROCESSING!!"

     return str;

}

但是在matcher.group(1),我得到了

107ec5141234742beec5cb5b1917e2e6:ENC}$${ENC}:d0b2ddf0b9e7b397558c20c623237c4f:{ENC}$${ENC}:85d6f3cd7dcc5c67cad68ae45a0d5afc:{ENC}$${ENC}:5c0dfb55a843f830024df0d74993b668
代替

107ec5141234742beec5cb5b1917e2e6

这是我所期待的。

我正在使用?在正则表达式中可以避免此问题。
当我在www.regexe.com上尝试过时,regex看起来还不错

我在这里做错了什么?

参考方案

问题是您使用的是 Matcher.matches() 而不是 Matcher.find()

从javadoc:

public boolean matches()
尝试根据图案匹配整个区域。

public boolean find()
尝试查找与模式匹配的输入序列的下一个子序列。

这是一个简单的代码,明确了区别:

Matcher matcher = Pattern.compile("\\Q${ENC}\\E(.*?)\\Q{ENC}$\\E").matcher("${ENC}1{ENC}$${ENC}2{ENC}$");

if (matcher.matches()) {
    System.out.println(matcher.group(1)); // Will print "1{ENC}$${ENC}2"
}

matcher.reset();

if (matcher.find()) {
    System.out.println(matcher.group(1)); // Will print "1"
}

Java Regex:将整个单词与单词边界匹配 - java

我正在尝试使用Java检查字符串是否整体上包含一个单词。以下是一些示例:Text : "A quick brown fox" Words: "qui" - false "quick" - true "quick brown" - true "ox" - fal…

java split regex-字符的任意组合 - java

我正在使用3个字符分割字符串:空格,破折号和逗号我想要的是能够使用这3个字符的任意组合进行拆分,例如:-,(破折号后跟逗号)或,--(逗号后加2破折号)或- , -(破折号,逗号间隔破折号)等 String address = "Sector -18B, Dwarka"; String[] addressParts = address.s…

Java RegEx中的单词边界\ b - java

我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)