QRegularExpression字符类正则无效排查:问题在^与-而非星号
QRegExp正则表达式在QRegularExpression中无效的原因分析
我有一个在QRegExp中可正常工作的正则表达式:
\[[a-zA-Z0-9/^-*]+\]
但该表达式在QRegularExpression中被判定为无效。最初误以为是字符类[]内的星号*存在特殊含义,尝试转义星号后的表达式:
\[[a-zA-Z0-9/^-\*]+\]
仍无效。改用分组写法\[([a-zA-Z0-9/^-]|\*)+\]可实现预期效果,但疑惑为何无法在字符类内直接使用星号。
验证测试代码(PySide6)
#!/usr/bin/env python3 from PySide6 import QtCore r = QtCore.QRegularExpression(r'\[[a-zA-Z0-9/^-*]+\]') print(r.isValid()) r = QtCore.QRegularExpression(r'\[[a-zA-Z0-9/^-\*]+\]') print(r.isValid()) r = QtCore.QRegularExpression(r'\[([a-zA-Z0-9/^-]|\*)+\]') print(r.isValid())
输出结果:
False False True
问题排查:并非星号,而是字符类中的^和-
测试代码:
#!/usr/bin/env python3 from PySide6 import QtCore good = '[A*m^-2]' bad = '[2 + 7]' # 原正则 r = QtCore.QRegularExpression(r'\[[a-zA-Z0-9/^-*]+\]') print('Valid' if r.isValid() else 'Not valid') print(r.match(good).hasMatch()) print(r.match(bad).hasMatch()) print() # 将^和-移至字符类末尾 r = QtCore.QRegularExpression(r'\[[a-zA-Z0-9/*^-]+\]') print('Valid' if r.isValid() else 'Not valid') print(r.match(good).hasMatch()) print(r.match(bad).hasMatch()) print() # 转义^和- r = QtCore.QRegularExpression(r'\[[a-zA-Z0-9/\^-\*]+\]') print('Valid' if r.isValid() else 'Not valid') print(r.match(good).hasMatch()) print(r.match(bad).hasMatch())
输出结果:
Not valid QRegularExpressionPrivate::doMatch(): called on an invalid QRegularExpression object (pattern is '\[[a-zA-Z0-9/^-*]+\]') False QRegularExpressionPrivate::doMatch(): called on an invalid QRegularExpression object (pattern is '\[[a-zA-Z0-9/^-*]+\]') False Valid True False Valid True False
结论
将字符类中的^和-移至末尾,或者对它们进行转义后,正则表达式即可在QRegularExpression中正常生效。
内容的提问来源于stack exchange,提问作者Michael Clerx
相关产品推荐
相关产品推荐

