Skip to the content.

Regex

基本学习路线

阅读这个文档

但是更加推荐交互式的教程图形化演示

学习完成之后,通过这个教程配套的 checksheet 来复习

用于测试和解释 regex 的网站

将 regex 转化为

regex

简写 描述
. 除换行符外的所有字符
\w 匹配所有字母数字,等同于 [a-zA-Z0-9_]
\W 匹配所有非字母数字,即符号,等同于: [^\w]
\d 匹配数字: [0-9]
\D 匹配非数字: [^\d]
\s 匹配所有空格字符,等同于: [\t\n\f\r\p{Z}]
\S 匹配所有非空格字符: [^\s]
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个垂直制表符
\p 匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符

https://matt.might.net/articles/sculpting-text

grep 默认情况下是 BRE

问题

  1. 直接

笔记

一些特殊字符用来指定一个字符在文本中重复的次数。它们分别是加号 +、星号 * 和问号 ?。

vim 的差别

vim 中使用 regex 参考这个总结

注意默认的时候,+ ? {} 需要通过 \+ \? \{} 来访问,而 ()| 是不支持的。

就需要使用 magic ooption, 通过 :h \v 查询[^1]。

https://thevaluable.dev/vim-advanced/

vim 中删除 trailing space 的命令 :%s/\s\+$/

bash 的扩展模式的差别

  regex expansion
? 让表达式可选 一个字符
* 零个或者多个 字符代表文件路径里面的任意数量的任意字符,包括零个字符。
[] 括号之中的任意一个字符。 相同
{} 描述个数 大括号扩展{…}表示分别扩展成大括号里面的所有值

在字符串的替换使用的是 expansion

str=aaabbb
echo ${str/?/sss}

有趣的文摘

\d

ag “apple.\d+,” 可以使用 \d ,但是 sed 不可以

才意识到,vim 的 regex 和其他的都不同

https://vi.stackexchange.com/questions/2268/are-vims-regex-magics-compatible-with-well-known-regex-classes

感觉默认是 PCRE,但是只是在 \ 上存在一些操作。

搞清楚 sed 的基本用法

那么请问

find 也是可以调整的为 regex 的

https://stackoverflow.com/questions/6844785/how-to-use-regex-with-find-command

也许用这个看看

https://regex-vis.com/

Lookarounds

https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md#4-%E9%9B%B6%E5%AE%BD%E5%BA%A6%E6%96%AD%E8%A8%80%E5%89%8D%E5%90%8E%E9%A2%84%E6%9F%A5

(?=) - positive lookahead
(?!) - negative lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind

(?>) - atomic group

https://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic-groups

# 得到第一个 foo
echo "foobarbarfoo" | grep -P 'foo(?=bar)'
echo "foobarbarfoo" | grep -P 'foo(?!bar)'
echo "foobarbarfoo" | grep -P '(?<=foo)bar'
echo "foobarbarfoo" | grep -P '(?<!foo)bar'

但是,这个的意义是什么?

echo "foobarbarfoo" | grep -P "(?=bar)foo"

非捕获组 是什么意思?

记录具体的 case

re.multiline 的意义是什么?

#!/usr/bin/env python3
import re

block="""
config ARCH_ZYNQ
	bool "Xilinx Zynq ARM Cortex A9 Platform"
	depends on ARCH_MULTI_V7
	select ARCH_HAS_RESET_CONTROLLER
	select ARM_AMBA
	select ARM_GIC
	select ARM_GLOBAL_TIMER
	select CADENCE_TTC_TIMER
	select HAVE_ARM_SCU if SMP
	select HAVE_ARM_TWD if SMP
	select MFD_SYSCON
	select PINCTRL
	select PINCTRL_ZYNQ
	select SOC_BUS
	help
	  Support for Xilinx Zynq ARM Cortex A9 Platform
"""
selects = re.findall(r'^\s+select\s+([^\n]+)', block, re.MULTILINE)
for sel in selects:
    print(sel)

必须带 multiline 才可以,是因为 selects 后面的 \n 匹配吗?

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。