如何编写正则表达式以匹配不以空格字符开头或结尾的字符串?匹配的字符串中间可以包含任何字符,重要的是,单字符字符串应匹配。
我的尝试是:
/\A\S.*\S\z/
但这与单个字符不匹配。
答案 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
这匹配字符串的开头,并要求(1)第一个字符是非空白字符,(2)最后一个字符是非空白字符。
匹配
a
a b
a b c d 1231 e
不匹配:
(只是一个空格)a
(领先空间)b
(尾随空格)