我刚刚完成了所有“简单”的CoderByte挑战,现在回过头来看看是否有更有效的方法来回答这些问题。我想为“SimpleSymbol”提出一个正则表达式。
(让函数SimpleSymbols(str)获取传递的str参数并确定它是否是可接受的序列 返回字符串true或false。 str参数将被组成 +和=符号之间有几个字母(即。 ++ d + === + c ++ == a)并且对于字符串为true,每个字母必须用+符号包围。所以左边的字符串是假的。 该字符串不会为空,并且至少有一个字母。)
我最初通过遍历整个字符串来回答问题,当找到一封信时,在任何一方进行测试以查看是否存在“+”。我认为如果我能用正则表达式测试字符串会更容易,比如
str.match(/\+[a-zA-Z]\+/g)
这不太奏效。我试图看看如果条件中的所有字符满足条件,匹配将仅返回true。例如,由于'+ d +'和'+ c +',该方法将在字符串“++ d + === + c ++ == a”上返回true。但是,基于原始问题,它应该返回false,因为'a'并且没有周围的'+'。
有什么想法吗?
答案 0 :(得分:1)
问题是+
是正则表达式中的特殊字符。它是一个量词,意思是“前一个项目中的一个或多个”。您可以通过转义来表示文字+
字符,如下所示:
str.match(/\+[a-zA-Z]\+/g)
但是,如果在匹配该模式的字符串中找到任何字符集,则返回true。如果你想确保字符串中没有其他字符与该模式不匹配,你可以这样做:
str.match(/^([=+]*\+[a-zA-Z](?=\+))+[=+]*$/)
这将匹配任意数量的=
或+
字符,后跟文字+
,后跟拉丁字母,后跟文字+
,全部可以重复一次或多次,然后是任意数量的=
或+
个字符。开头的^
和结尾的$
分别匹配输入字符串的开头和结尾。这可确保不允许其他字符。 (?=\+)
是一个前瞻断言,意味着下一个字符必须是文字+
,但不被视为组的一部分,这意味着它可以作为前导{{1}重新匹配在下一场比赛中(例如+
)。
答案 1 :(得分:1)
[^+][a-zA-Z]|[a-zA-Z][^+]
或类似的东西。这将找到规则的所有违规行为 - 在+
以外的字词旁边显示字母的时间。如果匹配,则可以返回false
,知道存在违规。否则,请返回true
。
原始答案:
这是一个正则表达式 - 我在下面解释它。请记住,你必须逃避+
,因为它是一个特殊的角色!
^([^a-zA-Z+]|(\+[a-zA-Z]\+)|[+])*$
^ // start of the string
[^a-zA-Z+] // any character except a letter or a + (1)
| // or
(\+[a-zA-Z]\+) // + (letter) + (2)
| //or
[+] // plus (3)
)*$ // repeat that pattern 0 or more times, end
+
的信件将失败。答案 2 :(得分:0)
/^[=+]*\+[a-z](?=\+)(?:\+[a-z](?=\+)|[+=]+)*$/i.test(str)
模式细节:
^ # anchor, start of the string [=+]* # 0 or more = and + \+ [a-z] (?=\+) # imposed surrounded letter (at least one letter condition) (?: # non capturing group with: \+[a-z](?=\+) # surrounded letter | # OR [=+]+ # + or = characters (one or more) )* # repeat the group 0 or more times $ # anchor, end of the string
要允许连续的字母如+a+a+a+a+a+
,我使用前瞻断言检查字母后面是否有+
符号,但不匹配。 (感谢ridgrunner的评论)
示例:
var str= Array('+==+u+==+a', '++=++a+', '+=+=', '+a+-', '+a+a+');
for (var i=0; i<5; i++) {
console.log(/^[=+]*\+[a-z](?=\+)(?:\+[a-z](?=\+)|[+=]+)*$/i.test(str[i]));
}
答案 3 :(得分:0)
有趣的问题!
+
,=
和[A-Za-z]
字母字符组成。+
开头,后跟+
。有效字符串:
"+A+"
"++A++"
"=+A+="
"+A+A+"
"+A++A+"
字符串无效:
+=+=
#必须至少有一个alpha
+A+&+A+
#无效的字符。
"+A"
#Alpha未跟随+。
"A+"
#Alpha前面没有+。
^[+=]*(?:\+[A-Z](?=\+)[+=]*)+$
(设置了i
ignorecase选项)
以下是我的方法:(首先在经过测试的python脚本中使用完全注释的正则表达式)
import re
def isValidSpecial(text):
if re.search(r"""
# Validate special exercise problem string format.
^ # Anchor to start of string.
[+=]* # Zero or more non-alphas {normal*).
(?: # Begin {(special normal*)+} construct.
\+[A-Z] # Alpha but only if preceded by +
(?=\+) # and followed by + {special} .
[+=]* # More non-alphas {normal*).
)+ # At least one alpha required.
$ # Anchor to end of string.
""", text, re.IGNORECASE | re.VERBOSE):
return "true"
else:
return "false"
print(isValidSpecial("+A+A+"))
现在这里是JavaScript语法中的相同解决方案:
function isValidSpecial(text) {
var re = /^[+=]*(?:\+[A-Z](?=\+)[+=]*)+$/i;
return (re.test(text)) ? "true" : "false";
}