检查字符串
Checking strings
只有当所有字母的两边都有“+”时,该函数才应该 return 为真,但我的值总是为真...我的代码有什么缺陷?
def SimpleSymbol?(str)
str_array = str.split("")
i = 0
while i < str_array.length-1
if ((str_array[i] >= "a") && (str_array[i] <= "Z"))
if ((i == 0) || (i == str_array.length-1))
return false
end
if ((str_array[i-1] != "+") && (str_array[i+1] != "+"))
return false
end
end
i += 1
end
return true
end
puts SimpleSymbol?("ads++d+")
"Z" 比 "a"smaller。
如果双方都必须 +
,并且您检查不匹配,则逻辑连接为 OR(= 如果其中任何一个为真)。
if ((str_array[i-1] != "+") || (str_array[i+1] != "+"))
注意:您不需要 split
,您可以对字符串进行索引。
最好用正则表达式处理:
def simple_symbol?(str)
!!str.match(/\A(\+[a-zA-Z](?:\+[a-zA-Z])*\+)\z/)
end
[
'+a+b+c+',
'+a+b+c',
'a+b',
'abc++d+',
'+',
'abc',
''
].each do |string|
puts '%-12s %s' % [ string, simple_symbol?(string) ]
end
# => +a+b+c+ true
# => +a+b+c false
# => a+b false
# => abc++d+ false
# => + false
# => abc false
# => false
请注意,Ruby 的方法名称约定是使用 underscore_type_names
,因为 CamelCase
是为 类 和模块保留的。
我同意@tadman 的观点,这里应该使用正则表达式。这是另一种方法,它查找未被 +
括起来的字母:
R = /
(?: # begin a non-capture group
\A # match beginning of string
| # or
[^+] # match any character other than +
) # end non-capture group
[a-b] # match a letter
| # or
[a-b] # match a letter
(?: # begin a non-capture group
[^+] # match any character other than +
| # or
\z # match end of string
) # end non-capture group
/xi # use extended mode (x) and make case insensitive (i)
def letters_bracketed?(str)
str !~ R
end
letters_bracketed?('+a+') #=> true
letters_bracketed?('+a+b+') #=> true
letters_bracketed?('+a+937+b+!!') #=> true
letters_bracketed?('a+b+') #=> false
letters_bracketed?('+a+b') #=> false
letters_bracketed?('+?a+b+') #=> false
letters_bracketed?('+ab+') #=> false
注意 +
不需要在字符 class 中转义。
只有当所有字母的两边都有“+”时,该函数才应该 return 为真,但我的值总是为真...我的代码有什么缺陷?
def SimpleSymbol?(str)
str_array = str.split("")
i = 0
while i < str_array.length-1
if ((str_array[i] >= "a") && (str_array[i] <= "Z"))
if ((i == 0) || (i == str_array.length-1))
return false
end
if ((str_array[i-1] != "+") && (str_array[i+1] != "+"))
return false
end
end
i += 1
end
return true
end
puts SimpleSymbol?("ads++d+")
"Z" 比 "a"smaller。
如果双方都必须
+
,并且您检查不匹配,则逻辑连接为 OR(= 如果其中任何一个为真)。if ((str_array[i-1] != "+") || (str_array[i+1] != "+"))
注意:您不需要 split
,您可以对字符串进行索引。
最好用正则表达式处理:
def simple_symbol?(str)
!!str.match(/\A(\+[a-zA-Z](?:\+[a-zA-Z])*\+)\z/)
end
[
'+a+b+c+',
'+a+b+c',
'a+b',
'abc++d+',
'+',
'abc',
''
].each do |string|
puts '%-12s %s' % [ string, simple_symbol?(string) ]
end
# => +a+b+c+ true
# => +a+b+c false
# => a+b false
# => abc++d+ false
# => + false
# => abc false
# => false
请注意,Ruby 的方法名称约定是使用 underscore_type_names
,因为 CamelCase
是为 类 和模块保留的。
我同意@tadman 的观点,这里应该使用正则表达式。这是另一种方法,它查找未被 +
括起来的字母:
R = /
(?: # begin a non-capture group
\A # match beginning of string
| # or
[^+] # match any character other than +
) # end non-capture group
[a-b] # match a letter
| # or
[a-b] # match a letter
(?: # begin a non-capture group
[^+] # match any character other than +
| # or
\z # match end of string
) # end non-capture group
/xi # use extended mode (x) and make case insensitive (i)
def letters_bracketed?(str)
str !~ R
end
letters_bracketed?('+a+') #=> true
letters_bracketed?('+a+b+') #=> true
letters_bracketed?('+a+937+b+!!') #=> true
letters_bracketed?('a+b+') #=> false
letters_bracketed?('+a+b') #=> false
letters_bracketed?('+?a+b+') #=> false
letters_bracketed?('+ab+') #=> false
注意 +
不需要在字符 class 中转义。