我在邮件模板(HTML内容)中有变量(例如$!{Full Name}
,$!{Full Na me}
)。我们先说吧。邮件模板的内容为:"买方名称为$!{Full Name}
。年龄是29岁。"在系统存储邮件模板之前,如果变量中有任何空格,则需要删除它。因此,输出模板将是"买方名称为$!{FullName}
。年龄是29岁。"
对于任何以下输入,所需输出为买方名称为$!{FullName}
。年龄是29岁。
$!{Full Name}
。年龄是29岁。$!{Full Na me}
。年龄是29岁。$!{ Full Na me}
。年龄是29岁。试图:
\$\!\{((?:\s*[a-zA-Z0-9_]*)*)\}
代替$!{$1}
由于我需要在Java中实现这一点,我可以解析整个内容并将这些变量(例如$!{Full Name}
,$!{Full Na me}
)放入列表中。删除空格后,再将它们放回去?可能是一个解决方案。但是,对此有任何替代解决方案吗?
答案 0 :(得分:2)
在Java中,最简单的解决方案是匹配$!{...}
字符串并在调用Matcher#appendReplacement
时删除其中的所有空格:
String s = "Buyer name is $!{ Full Na me}. Age is 29.";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\\$!(\\{[^}]+})").matcher(s);
while (m.find()) {
m.appendReplacement(result, "\\$!" + m.group(1).replaceAll("\\s+", ""));
}
m.appendTail(result);
System.out.println(result.toString());
// => Buyer name is $!{FullName}. Age is 29.
请参阅Java demo。
\$!(\{[^}]+})
模式与字面上的$!
匹配,然后捕获到第1组{
,后跟1 {+ 1}}以外的1个字符,然后是{{1 }}。在}
块内,空格会被}
删除。
如果您是一个正则表达式解决方案的粉丝,可以使用
while
并替换为.replaceAll("\\s+", "")
,请参阅this regex demo。
请参阅Java demo:
(\G(?!^)|\$!\{)([^}\s]*)\s+
正则表达式匹配
$1$2
- 第1组(此部分将与String s = "Buyer name is $!{ Full Na me}. Age is 29.";
s = s.replaceAll("(\\G(?!^)|\\$!\\{)([^}\\s]*)\\s+", "$1$2");
System.out.println(s);
// => Buyer name is $!{FullName}. Age is 29.
反向引用保持一致):上一个匹配结束((\G(?!^)|\$!\{)
)或$1
子字符串\G(?!^)
- 第2组(此部分将与$!{
反向引用保持一致):除([^}\s]*)
和空格之外的任何0 +字符$2
- 1+个空格(将被删除)。答案 1 :(得分:0)
您可以分两步完成此操作。
获取分隔符之间的子字符串( {和} ) -
(?<=\{)(.*)(?=\})
string : "Buyer name is $!{Full Name}. Age is 29."
=> subString = "Full Name"
string : "Buyer name is $!{Full Na me}. Age is 29."
=> subString = "Full Na me"
string : "Buyer name is $!{ Full Na me}. Age is 29."
=> subString = " Full Na me"
现在使用 -
替换捕获的子字符串中的空格/\s/g
合并原始字符串和已纠正的子字符串。