在下面的示例中,我有一系列[]
允许用户输入的字符。在此,我希望将特定角色限制为一次。
例如,我希望用户.
只输入一次。现在,我试过[\.]{1,1}?
了,但没有用。
"((([-]{1,1}?[0-9\\(]*\\.?[0-9\\(]+[\\+\\-\\*\\/\\)]?)*)|(?:[0-9-+*/^()x\\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)"
在下面的示例中,我有一系列[]
允许用户输入的字符。在此,我希望将特定角色限制为一次。
例如,我希望用户.
只输入一次。现在,我试过[\.]{1,1}?
了,但没有用。
"((([-]{1,1}?[0-9\\(]*\\.?[0-9\\(]+[\\+\\-\\*\\/\\)]?)*)|(?:[0-9-+*/^()x\\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)"
我假设,您直接从代码中复制了正则表达式。因此,不需要双重转义字符来分析您的正则表达式。它们只存在于那里,因为您必须\
在 Java 等字符串中转义每个字符串。首先分析以下正则表达式:
((([-]{1,1}?[0-9\(]*\.?[0-9\(]+[\+\-\*\/\)]?)*)|(?:[0-9-+*/^()x\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)
在您的问题中,您提到您希望将点字符 ( .
) 限制为仅一个字符。第一个问题是现在,.
你到底是什么意思?在您的正则表达式中,有 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\.?]
。这意味着,集合中的任何字符都必须精确匹配一次,因为在集合之后没有量词(例如+
, *
, ?
, {4,12}
)。例如,它将匹配5
, +
, ^
, x
, \.
,但只匹配一次。
现在的问题是,你想在这个正则表达式中改变什么?正则表达式已经符合您的期望。如果您的问题与此处描述的不同,您需要提供更多信息。