替换模式中的空格

时间:2017-05-23 03:49:46

标签: regex

我在邮件模板(HTML内容)中有变量(例如$!{Full Name}$!{Full Na me})。我们先说吧。邮件模板的内容为:"买方名称为$!{Full Name}。年龄是29岁。"在系统存储邮件模板之前,如果变量中有任何空格,则需要删除它。因此,输出模板将是"买方名称为$!{FullName}。年龄是29岁。"

对于任何以下输入,所需输出为买方名称为$!{FullName}。年龄是29岁。

  1. 买方名称为$!{Full Name}。年龄是29岁。
  2. 买方名称为$!{Full Na me}。年龄是29岁。
  3. 买方名称为$!{ Full Na me}。年龄是29岁。
  4. 试图: \$\!\{((?:\s*[a-zA-Z0-9_]*)*)\}代替$!{$1}

    由于我需要在Java中实现这一点,我可以解析整个内容并将这些变量(例如$!{Full Name}$!{Full Na me})放入列表中。删除空格后,再将它们放回去?可能是一个解决方案。但是,对此有任何替代解决方案吗?

2 个答案:

答案 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)

您可以分两步完成此操作。

  1. 获取分隔符之间的子字符串( {} ) -

    (?<=\{)(.*)(?=\})
    
    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"
    
  2. 现在使用 -

    替换捕获的子字符串中的空格
    /\s/g
    
  3. 合并原始字符串和已纠正的子字符串。