如何编写正则表达式以特定字符串开头和结尾?

时间:2015-12-16 02:36:10

标签: regex

我有一个字符串,像这样:

{"content":(uint32)123", "id":(uint64)111, "test":{"hi":"(uint32)456"}}

我想得到结果:

(uint32)123
(uint64)111

所以我写这样的正则表达式:

[^(?!\")](\(uint32\)|\(uint64\))(\d)+[^(?!\")$]

但结果是:

:(uint32)123
:(uint64)111,

此处结果添加了:,

我希望正则表达式不是以"开头,而是以"结尾,现在我应该如何更改我的正则表达式?

3 个答案:

答案 0 :(得分:0)

(\(uint(?:32|64)\)\d+)适合我。它捕获整个字符串(uint[32/64])<any number of digits\>,而不会打扰之前或之后出现的字符。

答案 1 :(得分:0)

看起来你正试图使用​​负向前瞻和负面的后视检查。但你犯了几个错误:

  1. 你把它们放在像这样的符号组中:[^(?!\")]这个正则表达式的真正含义 - 不是方括号内的任何符号(^ - 代表不是)。它应该如何:(?!\") - 当前位置后的符号不应该引用(注意:如果在
  2. 之后没有符号,这也将起作用)
  3. 要在使用前瞻检查之前检查符号,请检查哪些语法为(?<!some_regexp)。所以它会是(?<!\")
  4. 您不需要检查行的开头或结尾。如果你这样做,你可以把它放在单独的负向前瞻/后方声明中。
  5. 以下是没有行开始/结束检查的更正示例:

    (?<!\")(\(uint32\)|\(uint64\))(\d)+(?!\")(?!\d)
    

    注意:您需要在末尾添加(?!\ d),否则如果有引号则会匹配除最后一位之外的所有内容。

    以下是行检查开始/结束的示例:

    (?<!^)(?<!\")(\(uint32\)|\(uint64\))(\d)+(?!\")(?!\d)(?!$)
    

    P.S。:取决于您使用的语言 - 您可能不需要转义引号 - 只有在它是字符串转义序列而不是regexp转义序列时才需要转义引号。

答案 2 :(得分:0)

在python中测试了以下内容

(?<!\")(\(uint32\)|\(uint64\))\d+(?!(\"|\d))