【问题标题】:How can I support regex character class subtraction with C++ regular expressions? [duplicate]如何使用 C++ 正则表达式支持正则表达式字符类减法? [复制]
【发布时间】:2021-03-09 01:49:42
【问题描述】:

我不知道是谁关闭了this question,但请实际阅读这个问题...这是一个合法的问题,我已经在网上进行了大量研究,但找不到任何方法在 C++ 中实现它。我只能假设关闭问题的人没有阅读它。 (他们没有提供关闭问题的任何理由,所以如果您要再次关闭它,请解释原因。)

我正在编写一个 C++ 程序,它需要采用在 XML Schema 文件中定义的正则表达式并使用它们来验证 XML 数据。问题是,C++ 似乎不直接支持 XML Schema 使用的正则表达式风格。

例如,有几个特殊字符类 \i\c 默认情况下未定义,而且 XML Schema 正则表达式语言支持称为“character class subtraction”的东西,C++ 似乎不支持.

允许使用\i\c 特殊字符类非常简单,我可以在正则表达式中查找“\i”或“\c”并将它们替换为它们的扩展版本,但是得到字符类减法工作是一个更令人生畏的问题......

例如,这个在 XML Schema 定义中有效的正则表达式会在 C++ 中引发异常,指出它有不平衡的方括号。

#include <iostream>
#include <regex>

int main()
{
    try
    {
        // Match any lowercase letter that is not a vowel
        std::regex rx("[a-z-[aeiuo]]");
    }
    catch (const std::regex_error& ex)
    {
        std::cout << ex.what() << std::endl;
    }
}

如何让 C++ 识别正则表达式中的字符类减法?或者更好的是,有没有办法直接在 C++ 中使用正则表达式的 XML Schema 风格?

【问题讨论】:

  • 我认为您的问题是完全有效的(尽管答案可能是它不受支持)。 [regex] 标签也适用于这个问题,但是,简单地添加该标签可能会关闭您的问题。请不要添加该标签。事实上,我强烈建议不要在任何关于 SO 的问题中添加 [regex] 标签。
  • 我知道这个问题并不是专门寻找正则表达式中的语法错误,但它绝对是一个直接关于正则表达式的问题,所以“regex”标签适用。 (除非我完全误解了应该如何使用标签)
  • 由于您的原始问题已重新打开,您可以继续关闭此问题作为副本。
  • 谢谢@cigien :) 既然我对最初的问题给予了赏金,我离找到一个可靠的解决方案越来越近了。

标签: c++ regex c++17 character-class


【解决方案1】:

我从来没有听说过字符类减法,但是如果你想要任何非元音小写字母,你可以很容易地用常规字符类来表达:

std::regex rx("[a-df-hj-np-t-v-z]");

【讨论】:

  • 问题是,包含正则表达式的字符串将由用户提供,我需要支持用户提供的使用字符类减法的正则表达式字符串,因为 XML 模式定义的正则表达式规范需要它......为什么这么令人沮丧哈哈。如果可以的话,我会使用替代模式字符串。我开始认为我可能需要将我的正则表达式卸载到另一种支持此的语言。我认为 Python 可能具有支持这一点的正则表达式风格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2023-01-17
  • 2018-12-03
相关资源
最近更新 更多