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

JavaScript Regular Expression (If and only if)

本文关键字:当且仅当 正则表达式 JavaScript      更新时间:2023-09-26

我刚刚完成了所有"简单"的CoderByte挑战,现在回去看看是否有更有效的方法来回答这些问题。 我正在尝试为"SimpleSymbol"想出一个正则表达式。

(让函数 SimpleSymbols(str( 获取正在传递的 str 参数,并通过任一方法确定它是否是可接受的序列 返回字符串 true 或 false。str 参数将被组成 的 + 和 = 符号之间有几个字母(即。 ++d+===+c++==a(,并且要使字符串为真,每个字母必须用 + 符号括起来。所以左边的字符串是假的。 字符串不会为空,并且至少包含一个字母。

我最初通过遍历整个字符串来回答这个问题,当找到一个字母时,在两边测试是否存在"+"。 我认为如果我可以用正则表达式测试字符串会更容易,

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

这不太管用。我正在尝试查看匹配是否仅在字符串中的所有字符都满足条件时才返回 true。 例如,由于"+d+"和"+c+",该方法将在字符串"++d+===+c++==a"上返回true。 但是,根据原始问题,它应该返回 false,因为"a"和周围的"+"。

有什么想法吗?

编辑:@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(
  • 如果我们有一个+(字母(+,那很好。 捕捉到它。(二(
  • 如果我们自己有一个 +,那也没关系。(三(
  • 没有周围+的字母将失败。

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

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

但是,如果在字符串中找到与该模式匹配的任何字符集,这将返回 true。如果要确保字符串中没有其他字符与该模式不匹配,则可以执行以下操作:

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

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

有趣的问题!

字符串要求:

  • 字符串必须仅由 +=[A-Za-z] 字母字符组成。
  • 每个 alpha 字符前面都必须有一个+,后面都有一个+
  • 必须至少有一个阿尔法字符。

有效字符串:


"+A+"
"++A++"
"=+A+="
"+A+A+" "+A++A+"

无效字符串:

+=+= # 必须至少有一个 alpha。
+A+&+A+ # 无效字符。
"+A" # 字母后不跟 +。
"A+" # 字母前面没有 +。

溶液:

^[+=]*(?:'+[A-Z](?='+)[+=]*)+$(设置了i忽略大小写选项(

以下是我的做法:(首先在经过测试的 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";
}
/^[=+]*'+[a-z](?='+)(?:'+[a-z](?='+)|[+=]+)*$/i.test(str)

图案详情:

^ # 锚点,字符串的开头[=+]* # 0 或更多 = 和 +''+ [a-z] (?=''+( # 强制括起来的字母(至少一个字母条件((?: # 非捕获组:    ''+[a-z](?=''+( # 括起来的字母  |              # 或    [=+]+ # + 或 = 字符(一个或多个((* # 重复组 0 次或更多次$ # 锚点,字符串末尾

为了允许像+a+a+a+a+a+这样的连续字母,我使用一个前瞻断言来检查字母后面是否有一个+符号而不匹配它。(感谢里格伦的评论(

例:

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]));
}
相关文章: