1

「簡単な」CoderByte の課題をすべて終えたところです。質問に答えるより効率的な方法があるかどうかを確認するために戻ってきました。「SimpleSymbol」の正規表現を考え出そうとしています。

(SimpleSymbols(str) 関数に、渡された str パラメーターを取り、文字列 true または false を返すことによって、それが受け入れ可能なシーケンスかどうかを判断させます。str パラメーターは、+ 記号と = 記号で構成され、それらの間にいくつかの文字があります (つまり. ++d+===+c++==a) 文字列が true になるには、各文字を + 記号で囲む必要があります. したがって、左側の文字列は false になります. 文字列は空ではなく、少なくとも一文字。)

私はもともと、文字が見つかったときに文字列全体をトラバースし、どちらかの側で「+」が存在するかどうかをテストすることで質問に答えました。次のような正規表現で文字列をテストできれば簡単だと思いました。

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

これはうまくいきません。文字列内のすべての文字で条件が満たされた場合にのみ、一致が true を返すかどうかを確認しようとしています。たとえば、'+d+' と '+c+' により、このメソッドは文字列 "++d+===+c++==a" に対して true を返します。ただし、元の質問に基づいて、「a」と周囲の「+」がないため、false を返す必要があります。

何か案は?

4

4 に答える 4

1

問題は、それ+が正規表現の特殊文字であることです。「前の項目の 1 つまたは複数」を意味する数量詞です。+次のように、エスケープすることでリテラル文字を表すことができます。

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

ただし、そのパターンに一致する文字列に文字のセットが見つかった場合、これは true を返します。そのパターンに一致しない他の文字が文字列に含まれていないことを確認したい場合は、次のようにすることができます。

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

=これは、任意の数のまたは+文字に一致し、その後にリテラル+が続き、その後にラテン文字が続き、その後にリテラル が続き+ます。これらはすべて 1 回以上繰り返される場合があり、その後に任意の数の=または+文字が続きます。^先頭と末尾の$は、それぞれ入力文字列の先頭と末尾に一致します。これにより、他の文字が許可されなくなります。は(?=\+)先読みアサーションです。つまり、次の文字はリテラル である必要がありますが、グループの一部とは見なされません。これは、次の一致+の先頭として再一致できることを意味します(例: )。++a+b+

于 2013-08-28T22:51:34.800 に答える
0

面白い問題!

文字列の要件:

  • +文字列は、、=および[A-Za-z]アルファ文字のみで構成する必要があります。
  • すべてのアルファ文字の前に a+を付け、その後にa を付ける必要があります+
  • 少なくとも 1 つのアルファ文字が必要です。

有効な文字列:

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

無効な文字列:

+=+= # 少なくとも 1 つのアルファが必要です。
+A+&+A+ # 無効な文字。
"+A" # アルファの後に + が続きません。
"A+" # 先頭に + が付いていないアルファ。

解決:

^[+=]*(?:\+[A-Z](?=\+)[+=]*)+$( iignorecase オプションを設定した場合)

これが私がそれを行う方法です:(完全にコメントされた正規表現を使用したテスト済みの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 に答える
0
/^[=+]*\+[a-z](?=\+)(?:\+[a-z](?=\+)|[+=]+)*$/i.test(str)

パターンの詳細:

^ # アンカー、文字列の開始
[=+]* # 0 以上 = と +
\+ [az] (?=\+) # 強制囲まれた文字 (少なくとも 1 文字の条件)
(?: # 非キャプチャ グループ:
    \+[az](?=\+) # 囲まれた文字
  | | # また
    [=+]+ # + または = 文字 (1 つ以上)
)* # グループを 0 回以上繰り返す
$ # アンカー、文字列の終わり

のような連続した文字を許可するため+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]));
}
于 2013-08-28T22:55:28.753 に答える