【问题标题】:How to search for occurrences of more than one space between words in a line如何搜索一行中单词之间出现的多个空格
【发布时间】:2022-03-10 01:02:08
【问题描述】:

如何搜索一行中单词之间出现的多个空格

1. this is a line containing  2 spaces
2. this is a line containing   3 spaces
3. this is a line containing multiple spaces first  second   three   four

以上所有都是此正则表达式的有效匹配项。我应该使用什么正则表达式?

【问题讨论】:

  • 您是要检查连续的空格还是该行中的所有空格?
  • 连续空格不是所有空格
  • “字与字之间”到底是什么意思?在您的两个示例中,单词和数字之间有多个空格。标点符号呢(例如,您想匹配一个点之后和下一个单词之前的多个空格)?一行中最后一个字符之前/之后的空格呢?你也想匹配标签吗?那些只包含空格的行呢?
  • “containing and 2”、“containing and 3”、“first and second”、“second and three”之间的空格......是的,我想匹配点之后和下一个单词之前的空格。

标签: regex eclipse replace


【解决方案1】:
[ ]{2,}

空间(2个或更多)

您还可以检查这些空格前后是否跟有单词。 (不是其他空格,如制表符或换行符)

w[ ]{2,}w

相同,但您也可以仅选择(捕获)用于替换等任务的空间

w([ ]{2,})w

或者看到空格前后有任何东西,不仅仅是单词字符(空格除外)

[^s]([ ]{2,})[^s]

【讨论】:

  • w 表示“单词字符”,即字母数字和下划线,但不包括其他非空格字符。要检查非空白,请使用 S(大写 S)。此外,第一个将只匹配包含两个或更多空格的行,没有其他内容。
  • 我试图发展这个问题。我知道我错过了你用 S 说的话,我只是不想依赖字符大小写来实现这样的功能,这样更容易阅读。
  • 你为什么要使用锚点?他正在寻找嵌入线条中某处的空间。
  • w[ ]{2,}w 将无法匹配 word.<2 spaces>more words 或完全由空格组成的字符串。 [^s]([ ]{2,})[^s]w 将在以空格或字符串开头的行上失败,例如 bla<2 spaces>....
  • 说明:1){min,max} 运营商是一般重复量词2)省略 max离开逗号表示无限重复。
【解决方案2】:

简单的解决方案:

/s{2,}/

这匹配所有出现的一个或多个空白字符。 如果您需要匹配整行,但前提是它包含两个或多个连续的空白字符:

/^.*s{2,}.*$/

如果空格不需要连续:

/^(.*s.*){2,}$/

【讨论】:

  • .* 通常是贪心的,这意味着它会到达测试字符串的末尾,如果有强制字符,则后面的所有内容都不会匹配。通常在这种情况下,添加 ? 是一个好习惯,例如 .*?。它发生在我身上使用 PHP 的 PCRE
  • 它确实匹配。 “贪心”意味着它尽可能多地匹配,同时仍然匹配整个模式。 /^.*b.*$/ 实际上匹配"foobar",即使您期望第一个贪婪的.* 已经匹配整个字符串。
  • 要搜索一个或多个空格,这在 gvim 中有效:s{1,} > 我必须为 { 和 } 添加转义字符。谢谢 :)
【解决方案3】:

此正则表达式选择所有空格,您可以使用它并将其替换为单个空格

s+

蟒蛇中的例子

result = re.sub('s+',' ', data))

【讨论】:

  • 为什么是问题的答案?例如,如果只想替换多个空格(使用制表符)或任何其他匹配的操作,这将不起作用仅限多个空格(根据原始问题)。
  • 这将选择所有内容,而不仅仅是空格
【解决方案4】:

搜索[ ]{2,}。这将在该行内的任何位置找到两个或多个相邻的空格。它还将匹配前导空格和尾随空格以及完全由空格组成的行。如果您不想那样,请查看亚历山大的回答。

实际上,您可以省略括号,它们只是为了清楚起见(否则重复的空格字符不太明显 :))。

s{2,} 的问题在于它还会匹配 Windows 文件上的换行符(其中换行符由 CRLF 表示,与 s{2} 匹配。

如果您还想查找多个制表符和空格,请使用[ ]{2,}

【讨论】:

  • more than one space between words in a line[ ]{2,}在单词之间如何?你甚至读过这个问题吗?
  • 这就是为什么我提到你的答案,以防 OP 真的想像他写的那样严格。也许我们应该问问他。
【解决方案5】:

这是我的解决方案

[^0-9A-Z,
]

这将删除所有数字、逗号和新行,但选择中间空格,例如数据集

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 2014-06-06
    • 2021-12-24
    • 2011-05-29
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多