【问题标题】:Regex to trim spaces from the end of unknown length strings of words正则表达式从未知长度的单词字符串的末尾修剪空格
【发布时间】:2016-06-27 23:22:30
【问题描述】:

示例字符串:

This is "a"  test        
This & test         
This test string-has more words     

在上述每个示例中,我都有不同长度的单词字符串。这些字符串中的每一个都后跟一系列空格,之后没有任何内容。

我的应用程序在正则表达式的各个部分周围使用(),以便在必要时仅返回匹配模式的那部分。

我需要一个正则表达式,它会返回完整的字符串,无论长度如何,减去末尾的空格。

我现在是(.*)\s{1,}$|(.*\S)$ 如果字符串末尾有 0 个空格或字符串末尾有 1 个空格,但有 2 个或更多空格,并且这些空格包含在输出中,则此方法有效。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请告诉我们what you have tried,以及您遇到的具体问题或错误。请务必包含Minimal, Complete, Verifiable Example
  • 我不知道为什么我被否决了......我一开始没有提供我的代码,因为我是从我的手机发布的,但我已经添加了我当前的正则表达式,我是仍然被否决。
  • 你可以试试:/.*(?= |$)/。另外,您使用的是什么语言/工具?
  • 它不是任何语言/代码的一部分,它是我们使用的这个应用程序的一个功能,在应用程序中你可以编写正则表达式。您提供的解决方案没有删除尾随空格。非常感谢您的尝试。
  • 应用有名字吗?或者至少是用任何语言/工具编写的?您是要从开头匹配到最后一个非空格还是替换结尾空格?

标签: regex pattern-matching


【解决方案1】:

以下正则表达式将仅从字符串末尾修剪空格:

\s+$/g

解释:

  • \s+$ := 检查字符串末尾是否有连续任意数量的空白字符
  • g := 搜索多个匹配项

同样,下面的正则表达式除了字符串的结尾之外,还会从开头修剪空格:

/^\s+|\s+$/g

解释:

  • ^\s+ := 检查字符串开头是否有连续任意数量的空白字符
  • \s+$ := 检查字符串末尾是否有连续任意数量的空白字符
  • | := "OR",检查是否存在 ^\s+\s+$ 中的任何一个模式
  • g := 搜索多个匹配项

【讨论】:

    【解决方案2】:

    你的解释太小了。我不知道您想使用哪种语言,但我建议您使用 trim function 删除字符串开头和结尾的所有空格。但如果你坚持使用正则表达式,这里有一个正则表达式供你使用:

    /^[^ ][\w\W ]*[^ ]/
    

    它会从字符串的开头和结尾删除一个或多个空格。
    它支持除空格以外的任何普通字符。如果您需要更多限制,您可以操纵 \w\W 语句。 如果上面的表达式有错误,请告诉我。

    【讨论】:

    • 我改变了一个小东西,请重新复制表达式以获得最佳性能。
    • 它不是任何语言/代码的一部分,它是我们使用的这个应用程序的一个功能,并且在应用程序中你可以编写正则表达式,所以我不能使用修剪功能。无论如何,您上面提供的正则表达式可以完美地删除尾随空格,但不是开头的空格,但由于这不是必需的,我会奖励您答案。非常感谢。
    • 谢谢布莱恩。如果您不想从开头删除空格,只需从表达式的开头删除 [^]。我的意思是:/^[\w\W]*[^]/
    【解决方案3】:

    如果您需要正则表达式来执行此操作: ^\s*(\S(.*\S)?)\s*$

    删除任意数量的空格直到一个非空白字符,然后吃掉任意数量的字符直到最后一个非空白,然后切断所有尾随空白。还处理单个字符串。不会匹配空字符串。

    【讨论】:

      【解决方案4】:

      此代码似乎有效:.*\S

      这会删除前导和尾随空格:\S.*\S

      【讨论】:

      • 这才是真正正确的答案,如果我们想修剪其他键,我们可以使用:/([^\s"].*[^\s"])/
      【解决方案5】:

      这是一个真正有效的方法。 (用javascript测试)

      /^[\s\S]*?(?= *$)/
      

      打破其他答案的特殊情况:

      • 只包含空格的字符串
      • 空字符串
      • 包含换行符的字符串

      说明:

      ^ - 字符串的开头 [\s\S]*? - 匹配 0 个或更多(但尽可能少)的任何字符 (?= - 匹配后,字符串必须包含: * - 0 个或多个空格 $ - 和字符串的结尾 )

      【讨论】:

        【解决方案6】:

        我尝试了上面提到的几种解决方案,但找不到适用于任何字符串的解决方案,包括在引号中包含新行的字符串。不幸的是,即使来自12Me12 的解决方案也不起作用。我使用 Swift 5.2NSRegularExpression

        我找到了一个新的解决方案,它似乎对单行字符串和多行字符串都有效 - 甚至包括引号内的新行,这将被忽略。

        我使用的正则表达式是"\S[\s\S]*\S"

        例如,它将正确修剪以下字符串(注意开头的多余空格):

          {
          "age" : 68,
          "hobbies" : [
            "cooking",
            "guitar"
          ],
          "height" : 175
        }
        

        单行也将被正确修剪。在以下字符串中:

        Trim le please!

        正则表达式将匹配:

        Trim le please!

        说明

        所以我们想匹配第一个不是空格的字符:\S,当我们可以匹配任何空白或非空白字符时。似乎点. 不匹配空格,所以我们必须指定[\s\S]* 来匹配空格和非空格。最后,我们再次使用\S 强制最后一个字符为非空白字符。

        希望这对本主题的未来读者有用。

        【讨论】:

          猜你喜欢
          • 2011-02-25
          • 1970-01-01
          • 1970-01-01
          • 2016-04-23
          • 1970-01-01
          • 2021-09-16
          • 2020-11-05
          • 2010-11-23
          • 2023-03-31
          相关资源
          最近更新 更多