正则表达式从组中删除空格

Posted

技术标签:

【中文标题】正则表达式从组中删除空格【英文标题】:Regex Remove white spaces from a group 【发布时间】:2018-06-11 02:27:50 【问题描述】:

嗨,我有以下价值观

000001010016C02AB  111*
000001010016C02    111H
000001010016C      111 

预期的输出是

00000101001,C02AB,*
00000101001,C02,H
00000101001,C, 

值可能会有所不同。此字符串的长度将始终为 23。如果字符不存在,则该位置将用空格填充。我现在拥有的正则表达式是

(^.11)[0-9](.5)(?:.5)(.*)

但在第二组中使用此正则表达式时,会返回空格。我希望删除那些空白。

电流输出:

00000101001,C02AB,*
00000101001,C02  ,H
00000101001,C    , 

谁能帮我去掉第二组的空格?

Demo

【问题讨论】:

您的正则表达式风格(您使用的语言)是什么? @JorgeCampos Java 【参考方案1】:

使用结束断言$ 可以轻松匹配:

^(.11)\d(\w+).+(.)$

【讨论】:

【参考方案2】:

在 Java 中,您可以使用 Matcher#appendReplacement()trim() matcher.group(2) 值实现自定义替换逻辑:

String strs[]  = "000001010016C02AB  111*", "000001010016C02    111H", "000001010016C      111 ", "901509010012V      154 ";
Pattern p = Pattern.compile("(.11)[0-9](.5).5(.*)");
for (String s: strs) 
    StringBuffer result = new StringBuffer();
    Matcher m = p.matcher(s);
    if (m.matches()) 
            m.appendReplacement(result, m.group(1) + "," + m.group(2).trim()  + "," + m.group(3));
    
    System.out.println(result.toString());

结果:

00000101001,C02AB,*
00000101001,C02,H
00000101001,C, 
90150901001,V, 

请参阅Java demo。

注意我删除了^,因为Matcher#matches() 方法需要完整的字符串匹配。如果字符串可能包含换行符,请使用Pattern.DOTALL 选项。

【讨论】:

【参考方案3】: 查找:^(.11)\d(\S+)\s*.3(.?)$ 替换:$1,$2,$3

说明:

^           : beginning of string
  (.11)   : 11 any character, stored in group 1
  \d        : 1 digit
  (\S+)     : 1 or more non spaces, stored in group 2
  \s*       : 0 or more spaces
  .3      : 3 any character
  (.?)      : 0 or 1 character, stored in group 3
$

结果:

00000101001,C02AB,*
00000101001,C02,H
00000101001,C, 

【讨论】:

【参考方案4】:

在正则表达式中有捕获组,只需将这两个组连接起来就可以得到结果,在连接中可以插入逗号

 ^(\w+)\s*\d+(\D+)$

组就是里面的东西()

【讨论】:

我正在寻找删除捕获的空白。在此处查看示例regex101.com/r/vjucI9/2

以上是关于正则表达式从组中删除空格的主要内容,如果未能解决你的问题,请参考以下文章

如何从正则表达式捕获组中修剪空白?

正则表达式删除新行和空格

如何使用正则表达式删除尾随空格?

正则表达式仅删除数字之间的空格

正则表达式删除字符前字符串中间的空格

正则表达式从带有空格分隔符和描述中的空格的行中读取发票行详细信息