【问题标题】:Trimming multiple characters in a string修剪字符串中的多个字符
【发布时间】:2017-10-16 02:06:20
【问题描述】:

我的程序从文件中读取了一些必须进行后处理的字符串。文件中的原文是这样的

A1DY^
BLKSS^
"GH67^"^

^ 是我用来演示的空格字符。如您所见,文件中的所有单词都以空格结尾。有些单词是双引号。我想将这些字符串存储在我的程序中

A1DY
BLKSS
GH67

换句话说,我想修剪所有空格和双引号。如果我使用str.trim();,它将删除最后一个空格。所以,第三行将是"GH67^"。我还使用str.replaceAll("^\"|\"$", ""); 修剪双引号。结果是GH67^。这意味着,我必须再次修剪它。

有没有更好的方法一次删除所有空格和双引号?请注意,我不想提取字母数字字符。我想修剪特殊字符。

【问题讨论】:

  • 提取字母数字。如果文件中有DS-DK^,我想保存DS-DK
  • 使用 '\0' 代替空格可能更有用,因为 '\0' 从不用作字符。

标签: java string


【解决方案1】:

在对问题描述的严格解释中,您只希望删除 尾随 个空格,而不是前导空格和其他空白字符,如制表符 (\t)。

此外,如果同时找到前导对和尾随对,并且只有一个这样的集合,则严格修剪函数只会删除双引号。

如果存在双引号,则双引号内的尾随空格也应删除。

要完成所有这些,严格,在单个正则表达式操作中,执行以下操作:

str = str.replaceFirst("^(\"?)(.*?) *\\1 *$", "$2");

这个正则表达式使用^$ 锚来确保它只匹配整个字符串。

前导 " 是可选的,如果存在,则匹配为捕获组 1。尾随 " 仅在前导 " 匹配时匹配,前导 " 仅在尾随 " 匹配时匹配。这是使用\1 反向引用可选的前导" 来完成的。如果匹配,它们将从结果中删除。

不删除前导空格,但删除可选尾随 " 之前和/或之后的任何尾随空格。

任何未删除的内容都被捕获在第 2 组中,并保留在替换字符串中。

【讨论】:

    【解决方案2】:

    这将从字符串的开头或结尾修剪任意数量的引号或空格:

    str = str.replaceAll("^[ \"]+|[ \"]+$", "");
    

    【讨论】:

    • 为防止常见的新手错误,请在前面添加str =
    • 从技术上讲,删除前导空格与 OP 的要求背道而驰,但它可能没有任何区别。
    • @Andreas 你在哪里看到的?
    • OP 说“你可以看到文件中的所有单词空格结尾”。当然,OP 也尝试使用trim(),它从两端修剪,但并不意味着使用trim() 是正确的,但由于 OP 认为trim() 不会出错,因此可能永远不会是需要保留的领先空间,这就是为什么我说“这可能没有区别”,我把我的赞成票留在原地。
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2016-07-07
    • 2021-07-22
    相关资源
    最近更新 更多