代码之家  ›  专栏  ›  技术社区  ›  Orby

Notepad++Regex需要用序列名替换ID[重复]

  •  -1
  • Orby  · 技术社区  · 6 年前

    我不太懂正则表达式。你能用简单易懂的方式向我解释一下吗?如果有任何在线工具或书籍,你也可以链接到它们吗?

    0 回复  |  直到 10 年前
        1
  •  765
  •   Greg Bacon    5 年前

    最重要的部分是概念。一旦你了解了构建块是如何工作的,语法上的差异只不过是温和的方言而已。正则表达式引擎语法之上的一层是您正在使用的编程语言的语法。像Perl这样的语言消除了大部分这种复杂性,但是如果在C程序中使用正则表达式,则必须记住其他注意事项。

    如果您认为正则表达式是可以随意混合和匹配的构建块,它将帮助您学习如何编写和调试自己的模式,以及如何理解其他人编写的模式。

    简单地开始

    从概念上讲,最简单的正则表达式是文字字符。模式 N 匹配字符“N”。

    相邻的正则表达式匹配序列。例如,模式 Nick 匹配序列“N”后跟“i”后跟“c”后跟“k”。

    如果你曾经用过 grep 在Unixeven上,如果只搜索外观普通的字符串,那么您已经在使用正则表达式了!(在 re 在里面 格雷普 引用正则表达式。)

    菜单上的顺序

    只需增加一点复杂性,你就可以将“尼克”或“尼克”与模式匹配起来。 [Nn]ick . 方括号中的部分是 字符类 ,这意味着它正好匹配一个包含的字符。也可以在字符类中使用范围,因此 [a-c] 匹配“a”或“b”或“c”。

    模式 . 是特殊的:它不是只匹配一个文本点,而是匹配 任何 性格 †. 在概念上和真正的大角色类是一样的 [-.?+%$A-Za-z0-9...] .

    把字符类看作菜单:只选择一个。

    有用的快捷方式

    使用 . 可以为您节省大量的输入,还有其他一些常见模式的快捷方式。假设你想匹配一个数字:一种方法是 [0-9] . 数字是一个频繁匹配的目标,因此您可以使用快捷方式 \d . 其他的是 \s (空白)和 \w (文字字符:字母数字或下划线)。

    大写的变体是它们的补语,所以 \S 匹配任意 -例如,空白字符。

    一次是不够的

    从那里,你可以重复你的部分模式 量词 . 例如,模式 ab?c 匹配“abc”或“ac”,因为 ? 量词使它修改的子模式成为可选的。其他量词是

    • * (零次或多次)
    • + (一次或多次)
    • {n} (完全正确 n个 时代)
    • {n,} (至少 n个 时代)
    • {n,m} (至少 n个 次数但不超过 时代)

    把这些积木拼凑起来 [Nn]*ick 匹配所有

    • 点击
    • 尼克
    • 尼克
    • 恩尼克
    • 恩尼克
    • 恩尼克
    • (等等)

    第一场比赛证明了一个重要的教训: * 总是成功的! 任何模式都可以匹配零次。

    其他一些有用的例子:

    • [0-9]+ (及其等价物 \d+ )匹配任何非负整数
    • \d{4}-\d{2}-\d{2} 匹配格式为2019-01-01的日期

    分组

    量词将模式修改到其最左边。你可能会想到 0abc+0 匹配“0abc0”、“0abc0”等,但模式 立即 加号量词的左边是 c . 这意味着 0abc+0 匹配“0abc0”、“0abcc0”、“0abccc0”等。

    若要将一个或多个“abc”序列的末尾与零匹配,请使用 0(abc)+0 . 括号表示可以量化为一个单位的子模式。正则表达式引擎保存或“捕获”与带圆括号的组匹配的输入文本部分也是常见的。用这种方法提取比特比计数索引更灵活,容易出错。 substr .

    交替

    早些时候,我们看到了一种匹配“Nick”或“Nick”的方法。另一种是交替 Nick|nick . 记住,交替包括它左边的一切和它右边的一切。使用分组括号限制 | , 例如 , (Nick|nick) .

    在另一个例子中,您可以等价地编写 [空调] 作为 a|b|c ,但这可能是次优的,因为许多实现假定备选方案的长度大于1。

    逃逸

    虽然有些字本身是匹配的,但有些字有特殊的含义。模式 \丁+ 不匹配反斜杠后跟小写D后跟加号:若要获取该值,我们将使用 \\d\+ . 反斜杠删除了下列字符的特殊含义。

    贪婪

    正则表达式量词是贪婪的。这意味着它们尽可能多地匹配文本,同时允许整个模式成功匹配。

    例如,假设输入是

    “你好,”她说,“你好吗?”

    你可能会想到 ".+" 只匹配“Hello”,然后当你看到它从“Hello”一直匹配到“you”时会感到惊讶吗.

    要从贪婪转变为你可能认为的谨慎,添加一个额外的 ? 到量词。现在你明白了 \((.+?)\) ,你的问题中的例子起作用了。它匹配文本左括号的序列,后跟一个或多个字符,并以右括号结尾。

    如果您的输入是'(123)(456)',则第一个捕获将是'123'。非贪婪量词希望允许模式的其余部分尽快开始匹配。

    (至于你的困惑,我不知道有什么正规的方言 ((.+?)) 会做同样的事。我怀疑有什么东西在传输过程中丢失了。)

    使用特殊图案 ^ 只在输入开始时匹配 $ 只在最后匹配。用你说的“我知道在前面和后面是什么,但是给我之间的一切”的模式做“书尾”是一个有用的技巧。

    假设要匹配表单的注释

    -- This is a comment --

    你会写 ^--\s+(.+)\s+--$ .

    建立自己的

    正则表达式是递归的,因此既然您了解了这些基本规则,就可以随意组合它们。

    编写和调试正则表达式的工具:

    免费资源

    脚注

    : 上面的陈述 . 为了教学目的,匹配任何字符都是一种简化,严格来说这是不正确的。点匹配除换行符以外的任何字符, "\n" ,但在实践中,您很少期望这样的模式 .+ 越过新线边界。Perl正则表达式有 /s switch 和爪哇 Pattern.DOTALL ,例如,使 . 完全匹配任何字符。对于没有这种特性的语言,可以使用 [\s\S] 匹配“任何空白或非空白”,换言之就是任何内容。