【问题标题】:Regex that fail when there excessive whitespaces between words单词之间有过多空格时失败的正则表达式
【发布时间】:2015-08-24 14:52:53
【问题描述】:

我正在尝试在 Java 中创建一个与单词之间过多的空格以及开头和结尾的空格不匹配的正则表达式。

到目前为止我已经完成了这个正则表达式

^[\\S].*[\\S]$

当一行的开头和结尾有空格时会失败

但是单词之间有过多的空格怎么办?

我希望这条线失败:

"test    test"

但不是这个:

"test test"

我试过这个:

^[\\S].*(?![\\s]{2,}).*[\\S]$

但它没有用。

【问题讨论】:

  • 为什么不在将字符串发送到您的方法之前修剪字符串?
  • 您希望过多的空白字符串失败,还是要修剪行内的空白以使其不会失败?
  • @willOEM 当字符串以空格开头/以空格结尾/单词之间有 2 个或更多空格时,正则表达式应该会失败。

标签: java regex regex-negation


【解决方案1】:

对于失败的情况,只需检查:

\s{2,}

即空格 2 次或更多次。如果有匹配则验证失败。

【讨论】:

    【解决方案2】:

    这应该检查前后和两个以上的空格

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

    【讨论】:

      【解决方案3】:

      看完这个答案https://stackoverflow.com/a/1240365/2136936

      我想出了以下正则表达式,这正是我想要的:

      ^[\\S](?!.*\\s{2,}).*[\\S]$
      

      我不明白的一件事是为什么它不能以这种方式工作:^[\\S].*(?!\\s{2,}).*[\\S]$

      【讨论】:

      • 您的第二种选择不起作用,因为它要求在 至少一个位置 在字符串中没有两个空格(否定之外的.*),而第一个要求没有两个空格。
      【解决方案4】:

      您可以使用以下正则表达式(假设您不想匹配空字符串):

      "^\\S++(\\s\\S++)*+$"
      

      首先是非零数量的非空白,然后是单个空白的多次(可能为零)重复,然后是多个(非零)非空白。

      除了非回溯++*+ 运算符,您还可以使用(具有相同结果)普通+* 运算符;请注意,如果字符串很长(几千字节),非回溯运算符的性能会好很多。

      【讨论】:

        猜你喜欢
        • 2013-03-06
        • 1970-01-01
        • 2017-12-24
        • 2016-08-25
        • 2021-01-06
        • 2020-05-09
        • 1970-01-01
        相关资源
        最近更新 更多