【问题标题】:How do I exclude a word from a regular expression search?如何从正则表达式搜索中排除单词?
【发布时间】:2011-07-20 18:21:33
【问题描述】:

如何为以下问题创建正则表达式:

我有一个字符串,
name1=value1;name2=value2;.....;

在某处,存在一对, "begin=10072011;" 我需要使用正则表达式从字符串中解析 all name=value;对,其中值是一个数字。但是,我想忽略名称begin

目前我有以下正则表达式:

([\\w]+)=([\\d]+);

我的选择begin 名称。如何将其更改为不包含 begin

【问题讨论】:

    标签: regex qt find


    【解决方案1】:

    (?!begin)\b(\w+)=(\d+);

    这使用负前瞻,因此如果字符串以“begin”开头,它将不匹配。 \b 是必需的,以便正则表达式不只是跳过“b”并匹配“egin=...”。

    请注意,在描述正则表达式时,您应该只使用单个反斜杠进行转义,尽管对于某些语言,您需要使用双反斜杠来转义反斜杠。

    【讨论】:

    • 谢谢!是的 - 因为使用了 c++ 字符串,所以使用双斜杠
    【解决方案2】:

    应该这样做:

    \b(?!begin=)(\w+)=(\d+)\b
    

    作为一个 C++ 字符串文字,它看起来像这样:

    "\\b(?!begin=)(\\w+)=(\\d+)\\b"
    

    \bword boundary;您使用它来确保匹配整个单词(因为“单词”是在正则表达式的上下文中定义的;请仔细阅读该页面)。例如,如果没有第一个 \b,正则表达式将无法正确匹配

    begin=1234   // OK
    

    ...但是它会向前跳过一个位置并匹配:

    egin=1234    // oops!
    

    【讨论】:

      【解决方案3】:

      我认为(?<=begin=)\d+(?=;) 会是更好的选择。

      如果你把所有的信息都保存为 XML 格式,工作会比现在容易得多。

      【讨论】:

      • 无论如何我都不同意这个答案,但 Qt 的 QRegExp 风格似乎不支持后视。 (ref)
      猜你喜欢
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2020-01-25
      • 2016-05-09
      • 2019-04-30
      • 2019-09-07
      • 2020-09-16
      相关资源
      最近更新 更多