【问题标题】:Regex for single space单个空格的正则表达式
【发布时间】:2012-11-22 15:48:16
【问题描述】:

我正在尝试匹配由多个空格分隔的文件。我遇到的问题是第一个字段可以包含一个空格。如何将其与正则表达式匹配?

例如:

Name           Other Data    Other Data 2 
Bob Smith      XX1           0101010101
John Doe       XX2           0101010101
Bob Doe        XX3           0101010101
John Smith     XX4           0101010101

我可以用一个正则表达式将这些行分成三个字段,用一个空格分隔,但在第一个字段中允许一个空格吗?

【问题讨论】:

  • 你使用什么语言?
  • 您不一定需要正则表达式。由于它们由空格分隔,因此您一次可以读取 15 个字符来获取每一列,然后去掉空格来获取数据。

标签: regex


【解决方案1】:

您好,下面的正则表达式应该可以工作

(\w*\s\w*)\s+\w{2}\d\s+\d*

【讨论】:

  • 您的回答让我找到了正确的正则表达式,谢谢。我使用的最后一个正则表达式是(.*?)[ ]{2,}(.*?)[ ]{2,}(.*?)[ ]{2,}(.*?)[ ]{2,}(.*?)[ ]{2,}(.*?)[ ]{2,}(.*?)$
【解决方案2】:

这可行:

图案:

(.*?)[ ]{2,}(.*?)[ ]{2,}(.*)

替换:

+$1+ -$2- *$3*

$1 包含第一列,$2 第二列,$3 第三列。

示例: http://regexr.com?32tbt

【讨论】:

    【解决方案3】:

    您可以在两个或多个空格处拆分:

    [ ]{2,}
    

    但你可能会更好,确定这个正则表达式的捕获长度:

    (Name[ ]+)(Other Data[ ]+)
    

    然后使用一个简单的子字符串方法将你的行分割成相同长度的部分。

    因此,在您的情况下,第一次捕获的长度为 15 个字符,第二个为 14 个,该列将有 13 个(但最后一个并不重要,这就是它实际上没有被捕获的原因)。然后取前 15 个字符、接下来的 14 个字符和每行的剩余字符以及 trim 每个字符(删除尾随空格)。

    【讨论】:

      【解决方案4】:

      我认为最简单的方法是使用匹配两个或多个空格的正则表达式。

      /  +/
      

      分解为...分隔符 (/) 后跟一个空格 () 后跟另一个空格一次或多次 (+) 后跟结束分隔符 (/ 在我的示例,但特定于语言)。

      简单地说,使用正则表达式来匹配空格,然后使用一个或多个空格来分割字符串。

      【讨论】:

      • / 不是正则表达式的一部分,仅在一定数量的语言中用作分隔符。另外,为了可读性,我强烈建议将正则表达式中的每个文字空间写为[ ]
      【解决方案5】:

      通常,对于此类文件,最好的方法是根据所需信息的位置获取子字符串,然后对其进行修剪。我看到您的文件在第二个字段之前包含 16 个字符,您可以从开头获取长度为 16 的子字符串,其中包含您想要的文本。您应该修剪它以仅获取您需要的文本而不包含空格。

      如果您发布的间距模式是一致的(如果它不会在此类不同文件之间发生变化),那么您还有另一个问题:更长的名称会发生​​什么?

      Name           Other Data
      Johnny AppleseeXX1
      TutankamonfirstXX2
      

      如果您真的想使用正则表达式,请务必避免那些极端情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 2016-11-29
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多