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

限制Regexp中一系列字符中的字符,regex,qregexp,qregularexpression,Regex,Qregexp,Qregularexpression,在下面的示例中,我在允许用户输入的[]中有一个a系列字符。在这里,我希望一个特定的角色被限制在,比如说,一次 例如,我希望用户只输入一次。现在,我尝试了[\.]{1,1}?,但没有成功 "((([-]{1,1}?[0-9\\(]*\\.?[0-9\\(]+[\\+\\-\\*\\/\\)]?)*)|(?:[0-9-+*/^()x\\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)

在下面的示例中,我在允许用户输入的
[]
中有一个a系列字符。在这里,我希望一个特定的角色被限制在,比如说,一次

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

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

我假设,您直接从代码中复制了正则表达式。因此,分析正则表达式时不需要双转义字符。它们仅存在于其中,因为您必须在字符串中转义每个
\
,例如Java。从分析以下正则表达式开始:

((([-]{1,1}?[0-9\(]*\.?[0-9\(]+[\+\-\*\/\)]?)*)|(?:[0-9-+*/^()x\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)
  • 第一次出现点是
    \.?
    。这意味着,如果有点或没有点,正则表达式将匹配。
    \
    将转义该点,因为
    字符将与每个字符匹配。问号
    意味着前面的字符必须出现在0到1 t之间imes。这个正则表达式也是如此:
    \.{0,1}
    。它们彼此相等

  • 这里,转义点
    \.
    是集合
    [0-9-+*/^()x\.?]
    的一部分。这意味着,集合中的任何字符都必须精确匹配一次,因为没有量词(例如
    +
    *
    {4,12}
    )例如,它将匹配
    5
    +
    ^
    x
    \.
    ,但只匹配一次


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

    X{1,1}?
    X{1,1}
    X{1}相同
    X
    相同。您的正则表达式非常疯狂。它包含直接嵌套的循环:
    ([0-9\(]+)*
    (内部组的所有其他部分都是可选的,即可以匹配0次)。它还包含具有重叠匹配的直接相邻循环:
    [0-9\(]*[0-9\+
    (中间的
    \?
    是可选的).在回溯正则表达式引擎中,这可以“永远”循环(可以匹配的可能组合的数量是天文数字)。您使用的是什么正则表达式的实现-您是否真的按照标记使用了Qt库?如果您使用的是某种语言,请标记它,例如Python。如果您能够解释您试图匹配的内容,然后从头重写正则表达式,会更容易。@halfer对此表示抱歉。我使用的是Qt。是的,正则表达式是大型re的一部分gexp,我已经用完整的regexp更新了我的问题。我已经尝试使用大括号,但没有效果。@XavierGeoffrey我更新了答案,但仍然不清楚您想要实现什么。是否要强制用户使用点?
    ((([-]{1,1}?[0-9\(]*\.?[0-9\(]+[\+\-\*\/\)]?)*)|(?:[0-9-+*/^()x\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)
                        ↑↑↑ (1)                                    ↑↑ (2)