JavaScript正则表达式(当且仅当)

时间:2013-08-28 22:45:23

标签: javascript regex

我刚刚完成了所有“简单”的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'并且没有周围的'+'。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

问题是+是正则表达式中的特殊字符。它是一个量词,意思是“前一个项目中的一个或多个”。您可以通过转义来表示文字+字符,如下所示:

str.match(/\+[a-zA-Z]\+/g)

但是,如果在匹配该模式的字符串中找到任何字符集,则返回true。如果你想确保字符串中没有其他字符与该模式不匹配,你可以这样做:

str.match(/^([=+]*\+[a-zA-Z](?=\+))+[=+]*$/)

这将匹配任意数量的=+字符,后跟文字+,后跟拉丁字母,后跟文字+,全部可以重复一次或多次,然后是任意数量的=+个字符。开头的^和结尾的$分别匹配输入字符串的开头和结尾。这可确保不允许其他字符。 (?=\+)是一个前瞻断言,意味着下一个字符必须是文字+,但不被视为组的一部分,这意味着它可以作为前导{{1}重新匹配在下一场比赛中(例如+)。

答案 1 :(得分:1)

编辑:@Marc提出了一个非常好的观点。最简单的方法是使用

搜索违规行为
[^+][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
  • 这背后的逻辑是:跳过与字符串无关的所有字符。 (1)
  • 如果我们有+(字母)+,那没关系。抓住那个。 (2)
  • 如果我们有一个+ all,那也没关系。 (3)
  • 不包围+的信件将失败。

答案 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]字母字符组成。
  • 每个字母字符必须以+开头,后跟+
  • 必须至少有一个alpha char。

有效字符串:

"+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";
}