正規表現をコードから直接コピーしたと思います。したがって、二重にエスケープされた文字は、正規表現を分析するために必要ありません。\
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)
あなたのドットの最初の出現は\.?
. つまり、正規表現は、ドットがあってもなくても一致します。\
ドットをエスケープし.
ないと、文字はすべての文字に一致するためです。疑問符?
は、先行する文字が 0 から 1 回出現する必要があることを意味します。この正規表現についても同じことが言えます: \.{0,1}
. それらは互いに等しいです。
ここで、エスケープされたドット\.
は set の一部です[0-9-+*/^()x\.?]
。+
つまり、セットの後に量指定子 ( 、*
、?
など)がないため、セット内の文字はいずれも 1 回だけ一致する必要があり{4,12}
ます。たとえば、、、、、、に一致しますが5
、1+
回だけです。^
x
\.
問題は、この正規表現で何を変更したいのかということです。正規表現はすでに期待どおりです。問題がここに記載されているものと異なる場合は、さらに詳しい情報を提供する必要があります。