在Regexp中限制一系列字符中的字符

时间:2017-01-03 05:31:51

标签: regex qregexp qregularexpression

在下面的示例中,我在[]中有一系列允许用户输入的字符。在这里,我想要将一个特定的角色限制在一次。

例如,我希望用户只输入一次.。现在,我尝试[\.]{1,1}?,但它没有用。

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

1 个答案:

答案 0 :(得分: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. 此处,转义点\.是集合[0-9-+*/^()x\.?]的一部分。这意味着,集合中的任何字符必须恰好匹配一次,因为集合后没有量词(例如+*?{4,12}) 。例如,它会匹配5+^x\.,但只会匹配一次。

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