第一个和最后一个字符的正则表达式条件

时间:2014-06-30 03:25:28

标签: ruby regex

如何编写正则表达式以匹配不以空格字符开头或结尾的字符串?匹配的字符串中间可以包含任何字符,重要的是,单字符字符串应匹配。

我的尝试是:

/\A\S.*\S\z/

但这与单个字符不匹配。

4 个答案:

答案 0 :(得分:3)

这是你不应该尝试构建匹配某些东西的正则表达式的情况之一,而是一个匹配补充的正则​​表达式,并且正面使用正则表达式。

re = /\A\s|\s\z/
re !~ " "     # => false
re !~ ""      # => true
re !~ "sss"   # => true
re !~ "s ss"  # => true
re !~ " s ss" # => false

答案 1 :(得分:1)

is_ok = lambda do |str|
  a, z = str.chars.first, str.chars.last
  "#{a}#{z}" =~ / |\n|\t/ ? false : true
end


#"more elegant" (yeah dude I rock)
is_ok = lambda {|str| [0, -1].map{|i| str.chars[i] }.join =~ / |\n|\t/ ? false : true}

答案 2 :(得分:0)

使用此正则表达式:

\A\S+(?:\s*\S+)*\Z

您可以使用this demo的测试字符串部分来查看其工作原理。我假设字符串可以跨越多行,因此\A\Z

在Ruby中,类似于:

if subject =~ /\A\S+(?:\s*\S+)*\Z/
    match = $&

<强>解释

  • \A锚点断言我们位于主题字符串的开头
  • \S+匹配一个或多个非空白字符(包括制表符,换行符等)。另外,如果您想在开头允许换行但只想排除空格字符,则可以使用{{1}而不是[^ ]+
  • \S+匹配任意数量的可选空白字符,后跟一个或多个非空格字符
  • (?:\s*\S+)量词重复零次或多次
  • *锚点断言我们位于主题字符串的末尾

答案 3 :(得分:-1)

使用前瞻,如下所示:

\A(?=\S).*\S\Z

Regex101 Demo

这匹配字符串的开头,并要求(1)第一个字符是非空白字符,(2)最后一个字符是非空白字符。

匹配

  • a
  • a b
  • a b c d 1231 e

不匹配:

  • (只是一个空格)
  • a(领先空间)
  • b(尾随空格)
  • 空字符串