限制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)