0

在下面的示例中,我有一系列[]允许用户输入的字符。在此,我希望将特定角色限制为一次。

例如,我希望用户.只输入一次。现在,我试过[\.]{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?)+)

在您的问题中,您提到您希望将点字符 ( .) 限制为仅一个字符。第一个问题是现在,.你到底是什么意思?在您的正则表达式中,有 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\.?]。这意味着,集合中的任何字符都必须精确匹配一次,因为在集合之后没有量词(例如+, *, ?, {4,12})。例如,它将匹配5, +, ^, x, \.,但只匹配一次。

现在的问题是,你想在这个正则表达式中改变什么?正则表达式已经符合您的期望。如果您的问题与此处描述的不同,您需要提供更多信息。

于 2017-01-03T22:22:35.543 回答