使用 Regex 查找模式并用处理后的数据替换它们
Finding patterns using Regex and replacing them with processed data
有
格式的输入字符串
${ENC}:107ec5141234742beec5cb5b1917e2e6:{ENC}$${ENC}:d0b2ddf0b9e7b397558c20c623237c4f:{ENC}$${ENC}:85d6f3cd7dcc5c67cad68ae45a0d5afc:{ENC}$${ENC}:5c0dfb55a843f830024df0d74993b668:{ENC}$
如您所见,数据(粗体)以 ${ENC}: 为前缀,以 :{ENC}$[= 为后缀45=]。我想用处理后的数据替换它们之间的所有字符串。
我正在使用正则表达式:
$\{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 上尝试时,正则表达式似乎没问题
我做错了什么?
问题是您正在使用 Matcher.matches()
instead of Matcher.find()
。
来自 javadoc:
public boolean matches()
Attempts to match the entire region against the pattern.
public boolean find()
Attempts to find the next subsequence of the input sequence that matches the pattern.
这是一个简单的代码,明确了区别:
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"
}
有
格式的输入字符串${ENC}:107ec5141234742beec5cb5b1917e2e6:{ENC}$${ENC}:d0b2ddf0b9e7b397558c20c623237c4f:{ENC}$${ENC}:85d6f3cd7dcc5c67cad68ae45a0d5afc:{ENC}$${ENC}:5c0dfb55a843f830024df0d74993b668:{ENC}$
如您所见,数据(粗体)以 ${ENC}: 为前缀,以 :{ENC}$[= 为后缀45=]。我想用处理后的数据替换它们之间的所有字符串。
我正在使用正则表达式:
$\{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 上尝试时,正则表达式似乎没问题
我做错了什么?
问题是您正在使用 Matcher.matches()
instead of Matcher.find()
。
来自 javadoc:
public boolean matches()
Attempts to match the entire region against the pattern.
public boolean find()
Attempts to find the next subsequence of the input sequence that matches the pattern.
这是一个简单的代码,明确了区别:
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"
}