0

[]以下の例では、ユーザーが入力できる一連の文字があります。これで、特定のキャラクターを、たとえば 1 回に制限したいと考えています。

たとえば、ユーザーに.一度だけ入力してもらいたいとします。今、私は試し[\.]{1,1}?ましたが、うまくいきませんでした。

"((([-]{1,1}?[0-9\\(]*\\.?[0-9\\(]+[\\+\\-\\*\\/\\)]?)*)|(?:[0-9-+*/^()x\\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)"
4

1 に答える 1

0

正規表現をコードから直接コピーしたと思います。したがって、二重にエスケープされた文字は、正規表現を分析するために必要ありません。\Java などでは文字列内のすべてをエスケープする必要があるため、それらはそこにしかありません。次の正規表現を分析することから始めます。

((([-]{1,1}?[0-9\(]*\.?[0-9\(]+[\+\-\*\/\)]?)*)|(?:[0-9-+*/^()x\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)

あなたの質問では、ドット文字 ( .) を 1 文字だけに制限したいとおっしゃいました。最初の質問は今、.あなたが実際に意味するのはどれですか? 正規表現には、2 つのドットがあります。

((([-]{1,1}?[0-9\(]*\.?[0-9\(]+[\+\-\*\/\)]?)*)|(?:[0-9-+*/^()x\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)
                    ↑↑↑ (1)                                    ↑↑ (2)
  1. あなたのドットの最初の出現は\.?. つまり、正規表現は、ドットがあってもなくても一致します。\ドットをエスケープし.ないと、文字はすべての文字に一致するためです。疑問符?は、先行する文字が 0 から 1 回出現する必要があることを意味します。この正規表現についても同じことが言えます: \.{0,1}. それらは互いに等しいです。

  2. ここで、エスケープされたドット\.は set の一部です[0-9-+*/^()x\.?]+つまり、セットの後に量指定子 ( 、*?など)がないため、セット内の文字はいずれも 1 回だけ一致する必要があり{4,12}ます。たとえば、、、、、、に一致しますが5、1+回だけです。^x\.

問題は、この正規表現で何を変更したいのかということです。正規表現はすでに期待どおりです。問題がここに記載されているものと異なる場合は、さらに詳しい情報を提供する必要があります。

于 2017-01-03T22:22:35.543 に答える