1

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

有任何想法吗?

4

4 回答 4

1

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

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

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

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

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

于 2013-08-28T22:51:34.800 回答
1

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

[^+][a-zA-Z]|[a-zA-Z][^+]

或类似的东西。这将发现所有违反规则的行为——当一个字母出现在除 a 之外的东西旁边时+。如果这匹配,那么您可以返回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)
  • 如果我们自己有一个 + ,那也很好。(3)
  • 没有环绕的字母+将失败。
于 2013-08-28T22:54:39.870 回答
0
/^[=+]*\+[a-z](?=\+)(?:\+[a-z](?=\+)|[+=]+)*$/i.test(str)

图案细节:

^ # 锚点,字符串的开始
[=+]* # 0 或更多 = 和 +
\+ [az] (?=\+) # 强制包围字母(至少一个字母条件)
(?: # 非捕获组:
    \+[az](?=\+) # 被包围的字母
  | # 或者
    [=+]+ # + 或 = 字符(一个或多个)
)* # 重复组 0 次或多次
$ # 锚点,字符串的结尾

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

例子:

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]));
}
于 2013-08-28T22:55:28.753 回答
0

有趣的问题!

字符串要求:

  • 字符串必须仅由+,=[A-Za-z]alpha 字符组成。
  • 每个 alpha 字符都必须以 a+开头,然后是 a +
  • 必须至少有一个 alpha 字符。

有效字符串:

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

无效的字符串:

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

解决方案:

^[+=]*(?:\+[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";
}
于 2013-08-29T01:44:14.780 回答